消息队列mq 总结整理

本文总结了消息队列MQ(如rabbitmq和kafka)防止消息丢失的方法,包括生产者、中间件和消费者层面的策略。对于rabbitmq,介绍了开启confirm模式和持久化配合使用以确保消息不丢失;kafka则通过设置复制因子、最小同步副本数、acks参数和重试次数来防止数据丢失。同时,文章讨论了如何防止重复消费和保证消费顺序性,并对比了kafka和rabbitmq的主要特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防止消息丢失(rabbitmq)

  • 生产者弄丢消息(消息发送到mq时半路丢了)
    • 方案:
      • 开启事务:不建议;同步方式;生产者发送数据之前开启rabbitmq事务(channel.txSelect),然后发送消息;吞吐量会下来,太耗性能。
      • 开启confirm模式:建议;异步方式;在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id。写入成功rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了;如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试或者你可以超时重试。
  • rabbitmq弄丢了消息
    • 方案:开启持久化,两个步骤
      • 第一个是创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据;
      • 第二个是发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的。
    • 持久化可和生产者的confirm机制配合用,只有消息被持久化到磁盘之后,才会通知生产者ack了,所以哪怕是在持久化到磁盘之前,rabbitmq挂了,数据丢了,生产者收不到ack,也是可以自己重发的。
  • 消费端弄丢了数据
    • rabbitmq的ack机制

防止消息丢失(kafka)

  • 生产者弄丢消息(消息发送到mq时半路丢了)
    • 设置了ack=all,一定不会丢,要求是,你的leader接收到消息,所有的follower都同步到了消息之后,才认为本次写成功了。如果没满足这个条件,生产者会自动不断的重试,重试无限次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值