最近工作中用到了RocketMQ,现记录下,如何正确实现消费~
- 消费者需要注意的问题
- 防止重复消费
- 如何快速消费
- 消费失败如何处理
- Consumer具体实现
- 防止重复消费
重复消费会造成数据不一致等问题。所以,消费者要做到消费幂等。
1)每次消费,记录messageId;如果再次消费该message,查询messageId是否已存在,已存在,就跳过消费;
2)使用具体业务状态来防止重复消费,例如如果状态已经被变更,说明已有消息被消费;
- 如何快速消费
消费过程缓慢,势必会造成消息积压,如何提高消费速度势必比较重要:
每次接收到消息后,不做处理(具体不一定,最好是简单),直接将消息保存到本地数据库,然后后台异步处理消息,这么做的好处:
1) 快速消费,如果消费过程比较耗时(大量更新,RPC调用等),可以将消息插入本地,然后后台异步消费,消费完成,更新本地消息状态。
2)失败可控,如果某条消息消费失败,不依赖于mq的重试机制,可以定时重跑消费失败的消息,或者人工触发重试消费。
- 消费失败如何处理
消费过程不能保证不出异常,虽然mq消费失败有重试机制,但我们并没有这么做,而是:
跟上面提到的一样,由于已经把消息存到了本地,消费失败,也不用担心,后台重跑即可~~~~
如果大家觉得上面说的哪方面有问题,或者有更好的实践,欢迎留言~~~~