- 状态判断:消费者把消费消息记录到redis中,再次消费时先到redis判断是否存在该数据,存在则表示消费过 , 直接丢弃
- 业务判断:消费完数据后 , 都是需要插入到数据库中,使用数据库的唯一约束防止重复消费 。插入数据库前先查询是否存在该数据 , 存在则直接丢弃消息,这种方式是比较简单粗暴地解决问题
生产端丢失的解决方案主要有 。
- 开启confirm模式,生产着收到MQ发回的confirm确认之后,再进行消息删除,否则消息重推 。
- 生产者端消息保存的数据库,由后台定时程序异步推送 , 收到confirm确认则认为成功,否则消息重推,重推多次均未成功 , 则认为发送失败 。
消费端消息丢失则关闭自动ack确认,消息消费成功后手动发送ack确认 。消息消费失败,则重新消费 。
(3)如何保证消息有序性在生产端发布消息时,每次法发布消息都把上一条消息的ID记录到消息体中,消费者接收到消息时,做如下操作:
- 先根据上一条Id去检查是否存在上一条消息还没被消费,如果不存在(消费后去掉id),则正常进行,如果正常操作
- 如果存在,则根据id到数据库检查是否被消费,如果被消费,则正常操作
- 如果还没被消费,则休眠一定时间(比如30ms),再重新检查,如被消费,则正常操作
- 如果还没被消费 , 则抛出异常
- 如果消息可以被丢弃,那么直接丢弃就好了
- 一般情况下,消息是不可以被丢弃的 , 这样就需要考虑策略了,可以将原本的消费端重新部署为一个新的消息队列(MQ)实例,并在后续增加消费端,以形成另一条生产-消息-消费的线路 。

文章插图
PS:实际项目中是否需要使用消息队列以及如何使用,还是要根据业务特点进行选择 , 一个UV没几个的系统,使用消息队列,则纯粹是老板掏钱、研发受罪了 。
推荐阅读
- 传感器有哪些,常用的工业机器人位移传感器有哪些
- oppo r9s plus发布会
- 汽车常用配件的更换周期是怎样的?保命又省钱,超级实用维护指南
- csgo常用的控制台命令
- 浴盐可以天天用吗 浴盐经常用,对身体好吗
- 娱乐圈传来张国立,许家印,白珊珊的消息
- 中国著名女歌手那英最新消息!一起看看
- Java Steam 常用 API
- JVM的调优常用参数
- 消息代理与事件代理:何时使用它们
