RabbitMQ可靠消息最终一致性

本文介绍了在分布式系统中使用RabbitMQ确保消息可靠性和最终一致性的方法。通过本地消息表确保消息发送,利用MQ持久化防止消息丢失,采用手动ACK保证消息消费,并通过消息去重表处理幂等问题。同时提供了本地消息表和去重表的SQL创建语句。

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

RabbitMQ可靠消息最终一致性

为什么要使用可靠消息最终一致性?

在实际的开发系统中,各个服务之间的调用可能是异步的,也就是说一个服务发消息给MQ然后,消费者从MQ中拿取消息。在这个过程中针对基于MQ的异步调用我们要保证分布式事务的原子性,要么一起成功,要么一起失败。所以这个时候就需要用上可靠消息最终一致性了。

什么是可靠消息最终一致性

通俗来讲就是上游服务需要保证消息一定会发出给MQ,下游服务一定会接收到消息,并且在成功消费掉消息之后,返回ack。这个方案是通过消息中间件完成的。

可靠消息最终一致性需要解决的问题

1 上游服务把信息成功发送

本地事务与消息发送的原子性问题:事务发起方在本地事务执行成功后消息必须发出去,否则就回滚事务。即实现本地事务和消息发送的原子性,要么都成功,要么都失败。

2 下游服务成把消息成功消费

事务参与方接收消息的可靠性:事务参与方必须能够从消息队列接收到消息。

3 对消息做幂等

消息重复消费的问题:由于网络2的存在,若某一个消费节点响应超时但是消费成功,此时消息中间件会重复投递此消息,就导致了消息的重复消费。

解决方案

问题 1:上游服务把消息成功发送

通过使用本地消息表来进行不断的扫描查看是否还有未发出的消息,通过quartz定时发送消息,如果发送成功,就讲本地消息表的状态改为成功发送状态或者删除。

可靠消息最终一致性流程图

问题2:消息中间件必须保证消息不丢失

消息中间件的持久化:

  1. MQ容器的持久化:声明的同时将durable属性设置为true
  2. exchange的持久化:声明的同时将durable属性设置为true
  3. Message的持久化:发送消息的时候,将basicProperties属性设置为MessageProperties.PERSISTENT_TEXT_PLAIN
问题3:下游服务成把消息成功消费

手动ack:保证消息投递失败时消息的重新投递

问题4:对消息做幂等

消息去重表:任务B处理消息前,先查询该消息是否被消费,如果没消费,处理任务B成功,记录消息。如果消息已经被消费,直接返回应答成功

在这里插入图片描述
附录1 本地消息表生成sql

DROP TABLE IF EXISTS `local_message`;
CREATE TABLE `local_message` (
  `tx_no` varchar(255) NOT NULL,
  `item_id` bigint DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  PRIMARY KEY (`tx_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

附录2 去重表生成sql

DROP TABLE IF EXISTS `msg_distinct`;
CREATE TABLE `msg_distinct` (
  `tx_no` varchar(255) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`tx_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
RabbitMQ是一款可靠的消息队列中间件,它可以通过一些机制来实现可靠消息最终一致性。 首先,RabbitMQ支持持久化消息。当消息被发送到队列中时,可以将消息标记为持久化,确保即使在系统故障或重启的情况下,消息也不会丢失。通过这种方式,可以保证消息的可靠性。 其次,RabbitMQ采用了发布-订阅的模式。生产者将消息发布到交换机上,然后交换机根据规则将消息路由到相应的队列上,消费者从队列中订阅并消费消息。通过这种方式,可以确保消息的可靠传递和消费。 另外,RabbitMQ还支持事务。在发送消息之前,可以开启一个事务并将消息发送到队列中。如果事务成功提交,则消息会被正式发送;如果事务回滚,则消息不会发送。通过使用事务,可以保证消息发送的可靠性和一致性。 还有一种机制是消息的确认机制。在消息发送之后,生产者可以等待RabbitMQ返回一个确认消息。只有当生产者接收到确认消息时,才能确定消息已经被成功处理并可以进行下一步操作。通过这种方式,可以保证消息的可靠发送和处理。 综上所述,RabbitMQ通过持久化、发布-订阅、事务和消息确认等机制,实现了可靠消息最终一致性。无论是在消息的传递过程中,还是在系统的故障和重启中,都能确保消息的可靠性和一致性,从而满足业务的需要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值