前言
rocketmq 消息队列在大部分业务系统中都会用到(如下图),服务A和服务B系统通过mq进行业务解耦;服务A处理完业务之后,发一条消息到rocketmq,服务B从rocketmq拉去消息进行消费。
上面这个流程会有下面几个问题:
1.如果服务A写数据库成功了,还没来得及发送消息就宕机了,这就会导致服务B永远消费不了消息,出现了数据不一致问题;
2. 服务A写数据库成功,发送mq消息失败,也会出现服务B消费不了消息的情况;
3.服务A写数据库成功,发mq消息成功了,但是服务A事务由于异常回滚了,服务B消费了消息。
针对上面的几个问题, 我们在生产开发中如何解决呢?
1.重试+回滚
针对第二个问题,我们可以使用重试加回滚的方式解决;先写本地事务,然后发送mq消息,如果发送失败再重试几次,重试也是失败就回滚本地事务。
public void doService() {
//执行本地事务
server.doLocalTransaction();
for (int i = 0; i < 3 ; i++) {
try {
producer.send(message);