资讯专栏INFORMATION COLUMN

如何保证消息队列的可靠性传输?

snifes / 3320人阅读

摘要:消息丢失分成三种情况,可能出现生产者消费者。生产者丢失数据生产者丢失数据首先要确保写入的消息别丢,消息队列通过请求确认机制,保证消息的可靠传输。只有消息被持久化到磁盘以后,才会回传消息。

消息丢失分成三种情况,可能出现生产者、RabbitMQ、消费者。

生产者丢失数据

首先要确保写入 RabbitMQ 的消息别丢,消息队列通过请求确认机制,保证消息的可靠传输。生产开启 comfirm 模式,在生产者开启 comfirm 模式之后,每次发送消息都会分配一个唯一的id。

  • 如果写入了 RabbitMQ 中,RabbitMQ 会回传一个 ack 消息
  • 如果没能写入 RabbitMQ,会回调一个 nack 接口, 可以重新发送消息

一般在生产者这块避免数据丢失,都是用 confirm 机制的

RabbitMQ丢失数据

RabbitMQ 丢失数据,需要开启 RabbitMQ 持久化,开启持久化之后,生产者发送的消息会持久化到磁盘,RabbitMQ 就算是挂了,恢复启动后也会读取之前存储的数据。
还有一种少见的情况,就是RabbitMQ还没将消息持久化,自己就挂了。这种情况需要生产者那边的确认机制结合起来。只有消息被持久化到磁盘以后,才会回传 ack 消息。生产者没有接收到 ack,也可以自己重发。

消费者丢失数据

消费丢失数据,刚消费到 RabbitMQ 发送的数据,消费进程就挂了,重启进程后,RabbitMQ 也不会重新发送消息。
这个时候需要关闭 RabbitMQ 关闭自动的 ack 机制。每次在消费端处理后,再在程序里做 ack 确认,这样的话,如果没有处理完,就没有 ack 确认,那 RabbitMQ 就认为你还没有处理完,这个时候 RabbitMQ 会重新发送消息给消费者。

总结

  • 生产者
    • 开启确认 comfirm 机制
  • MQ
    • 开启 RabbitMQ 持久化
  • 消费者
    • 关闭RabbitMQ 自动 ack 确认

如果觉得文章对你有帮助的话,请点个推荐吧!

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124131.html

相关文章

  • 消息队列二三事

    摘要:但是我们明显能感觉到这会降低吞吐量,因为消息不能并行投递了,而且会阻塞等待,也没法发挥的威力。 最近在看kafka的代码,就免不了想看看消息队列的一些要点:服务质量(QOS)、性能、扩展性等等,下面一一探索这些概念,并谈谈在特定的消息队列如kafka或者mosquito中是如何具体实现这些概念的。 服务质量 服务语义 服务质量一般可以分为三个级别,下面说明它们不同语义。 At most...

    dack 评论0 收藏0
  • 阿里云正式推出消息队列Kafka:全面融合开源生态

    摘要:在全面兼容Apache Kafka生态的基础上,消息队列Kafka彻底解决ApacheKafka稳定性不足的长期痛点,并且支持消息无缝迁移到云上。 近日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态。在全面兼容Apache Kafka生态的基础上,消息队列Kafka还具备了超易用,超高可用可靠性,扩缩容不操心,全方位安全诊断,数据安全有保障的特点。可用行达99.9%,数据可靠行99...

    aisuhua 评论0 收藏0
  • kafka消息队列

    摘要:为什么使用消息队列消息队列的优缺优点解耦异步消峰缺点系统的可用性降低,系统引入的外部依赖越多,越容易挂掉系统复杂性提高数据一致性问题常用消息队列的优缺点技术非常成熟,但是偶尔会出现较低概率的丢失消息,而且现在社区以及国内应用都越来越少社区相 为什么使用消息队列消息队列的优缺 1优点 (1) 解耦 (2) 异步 (3) 消峰 2 缺点 (1)系统的可用性降低,系统引入的外部依赖越多...

    godlong_X 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<