RabbitMQ如何保证消息可靠性?
关键词:RabbitMQ、消息不丢失、消息可靠性、持久化、消息重复消费。
本篇文章不再介绍RabbitMQ具体实现原理,直接介绍如何保证消息的可靠性问题。所谓可靠性,指消息不重不漏
。
生产者消费者模型
生产者-消费者模型用于描述两类进程(生产者和消费者)之间的数据交互。可以被认为是独立的服务,生产者负责生成数据,消费者负责处理这些数据。在分布式系统中,队列在其中扮演了消息(数据)传递的功能。
关于消息队列的作用,一般解读为:
解耦
:生产者和消费者独立运作,无需知道对方的运行状态。
异步
:并非实时,生产者不必关注消费端的消费情况。
削峰
:限制流量,防止消费者过载。
消息丢失
这其实不难理解,就像生活中下单-快递-签收
的过程。这个过程和上边的生产者-消费者模型
恰有异曲同工之妙。
这个过程中,
-
下单用户(生产者)
-
快递小哥(队列)
-
签收人(消费者)
-
快件(消息)
如果包裹被粗略的认为是一条消息,那么快件在邮寄过程中丢失了,就是消息丢失
。快件从发货到签收,我们不用去关心中间发生了什么。但是要是没收到货,那得给我个理由
。
如何排查?
就上边的快件丢失问题,怎么知道快递为何没有收到?很简单,一段一段的排查:
-
商家是否有发货?
-
快递公司是否揽收?
-
查看快递小哥是否放入代收点
相应的,如果生产环境中突然发现诸如:告警、服务宕机、数据流转异常等问题时,我们也会在链路上(A、B、C三处)逐一排查。
产生原因及解决方案
1、生产端可靠性投递
为确保消息从生产端可靠地投递到RabbitMQ,我们需要考虑以下几个关键点:
网络故障
:消息可能在传输过程中因网络问题而丢失。
RabbitMQ故障
:如果RabbitMQ宕机,消息也可能丢失。
对应解决方案:
-
开启事务机制
事务在RabbitMQ中可能会影响性能,因为它们需要在所有节点上同步状态。因此,RabbitMQ尽量避免使用事务。核心代码:
private static void executeTransaction(Channel cha