消息的可靠性
业务流程
说到消息的可靠性,首先看一下整个消息链过程
- 阶段一:消息在provider端产生,发送出来至消息中间件
- 阶段二:消息中间件接收provider发送的消息
- 阶段三:consumer从消息中间件拉取消息进行消费
问题产生
消息从产生到消费,至少就要经历上述两个网络过程,期间出现网络连接问题,或者某端宕机等问题,都会导致消息的丢失。
解决方案
生产者端
- 生产者发送消息至中间件,需要有确认机制,消息中间件确认收到,并将确认信息发送至生产者。
- 如果有需要,还需要给消息设置一个全局唯一ID,确保消息中间件不会保存重复的消息。
为什么说如果有需要呢?
如果说这个操作是 redis中的set,或者是往数据库中插入一条数据。即使是重复操作也并不会有对数据产生影响
中间件端
- 由于宕机导致消息丢失,可以开启中间件持久化。
消费者端
- 拉取到重复的消息,还是利用全局唯一ID,在消费消息的时候,将id加入redis中,消费前去redis中查看是否已经消费过该消息。
- 消费者刚拉到消息,宕机,消息队列中也没了。这时候应该在中间件中做处理,当得到消费者成功消费发送确认信息后,再删除该消息。但是这又引出上面同样的问题 ---- 如果消费者刚消费完,准备发消息的时候挂了。(是不是在找茬?),还是在redis中加入已消费的id,拉取的时候进行一次查询。