从Rocketmq的事务消息来看数据的强一致性

在分布式系统中经常遇到类似的场景: 本地执行DB业务操作,并通知微服务执行其他的业务操作。这里就涉及到数据一致性的问题,如何保证两个系统的操作同时成功或者同时失败?

Rocketmq事务消息可以保证业务与消息发送这两个操作的强一致性,为大家提供了一种思路。

传统的操作:

事物{

      1.调用接口

      2.业务逻辑处理

}

上述传统操作存在如下问题: 调用接口成功但业务逻辑处理失败,有可能导致数据不一致。调用接口后,正好kill -9,必然导致数据不一致。

Rocketmq是如何来处理这类问题的。

1.业务系统调用接口,这里理解为向rocketmq发送一条消息,rocketmq接收到此消息进行预处理,并不能直接消费。向rocketmq发送消息成功后,执行业务逻辑处理,后增加一张表来记录业务逻辑的处理状态。 注意:发送消息&业务逻辑处理&记录处理结果 需要在同一事务中。

2.rocketmq消费消息(预处理并非真实消息)时,先回调业务系统(生产者端),获取业务逻辑处理的结果,如果成功则将预处理消息置换为正式消息然后等待消费者消费。如果业务逻辑处理的结果为未知,则延迟重试。如果业务逻辑的处理结果为失败,则直接删除预处理消息。通过这种手段来保证分布式环境下的数据一致性。

这种方案增加的负担是:

 1. 调用接口放在事件中,这个一定要注意设置较短的超时时间,避免因大量超时导致事物长时间不能提交或回滚,从而拖垮DB

 2. 需要额外增加一张表(或者其它的方案)来记录业务逻辑的处理结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值