如何解决消息发送一致性

本文讨论了消息发送一致性的重要性,分析了实现过程中遇到的问题,并提出了通过消息中间件与业务应用交互来确保一致性的方法。

消息发送一致性是什么?

是指产生消息的业务动作与消息发送的一致,就是说,如果业务操作成功了,那么对应的消息一定要发送出去,否则就丢失消息了。而另一方面,如果这个业务行为没有发生或者失败,那么就不应该把消息发出去。

消息发送一致性很难保证吗?

void test(){
  //业务操作
  //列如写数据库,调用服务等
  //发送消息
}   

void test(){
  // 发送消息
  //业务操作
  //列如写数据库,调用服务等
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上面伪代码不管哪一步出现问题了,都很难保持一致性。虽然在实践中,第一种丢失消息的比例相对第二种是很低的。但是,要求保证一致性的场景,上面的两种方案都不能接受。

使用JMS可以实现消息一致性吗?

用过JMS的都知道,JMS的API种,有很多XA开头的接口。其实如果不实用XA系列的接口实现,那么我们就无法直接得到发送消息给消息中间件及业务操作这两个事情的事物保证,而JMS中定义的XA系列的接口就是为了实现分布式事务的支持(发送消息和业务操作很难做在一个本地事务中)。但是会有如下问题:

1.引入了分布式事务,这会带来一些开销并增加复杂性。 
2.对于业务操作有限制,要求业务操作的资源必须支持XA协议,才能够与发送消息一起来做分布式事务。这会成为一个限制,因为并不是所有需要与发送消息一起做成分布式事务的业务操作都支持XA协议。

其他的办法?

JMS可以解决一致性问题,但是存在一些限制并且成本相对较高。那么有没有其他的办法呢?如图所示方案。

可能这个过程当中会出现很多异常,下面具体分析下。

那么如何了解业务操作的结果呢?

下面展示了这个过程。由消息中间件主动询问业务应用,获取待处理消息所对的业务操作的结果,然后业务应用需要对业务操作结果进行检查,并且把结果发送给消息中间件,然后根据这个结果,更新状态。

转载于:https://my.oschina.net/xiaominmin/blog/1614159

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值