消息总线真的能保证幂等?

转载 2018年04月17日 13:24:35

消息总线真的能保证幂等?

原创 2017-03-31 58沈剑 架构师之路

一、缘起

如《消息总线消息必达》所述,MQ消息必达,架构上有两个核心设计点:

1)消息落地

2)消息超时、重传、确认

 

再次回顾消息总线核心架构,它由发送端、服务端、固化存储、接收端四大部分组成。


为保证消息的可达性,超时、重传、确认机制可能导致消息总线、或者业务方收到重复的消息,从而对业务产生影响。

 

举个栗子:

购买会员卡,上游支付系统负责给用户扣款下游系统负责给用户发卡,通过MQ异步通知。不管是上半场的ACK丢失,导致MQ收到重复的消息,还是下半场ACK丢失,导致购卡系统收到重复的购卡通知,都可能出现,上游扣了一次钱,下游发了多张卡

 

消息总线的幂等性设计至关重要,是本文将要讨论的重点。

 

二、上半场的幂等性设计

MQ消息发送上半场,即上图中的1-3

1,发送端MQ-client将消息发给服务端MQ-server

2,服务端MQ-server将消息落地

3,服务端MQ-serverACK给发送端MQ-client

如果3丢失,发送端MQ-client超时后会重发消息,可能导致服务端MQ-server收到重复消息

 

此时重发是MQ-client发起的,消息的处理是MQ-server,为了避免步骤2落地重复的消息,对每条消息,MQ系统内部必须生成一个inner-msg-id,作为去重和幂等的依据,这个内部消息ID的特性是:

1)全局唯一

2MQ生成,具备业务无关性,对消息发送方和消息接收方屏蔽

 

有了这个inner-msg-id,就能保证上半场重发,也只有1条消息落到MQ-serverDB中,实现上半场幂等。

 

三、下半场的幂等性设计

MQ消息发送下半场,即上图中的4-6

4,服务端MQ-server将消息发给接收端MQ-client

5,接收端MQ-clientACK给服务端

6,服务端MQ-server将落地消息删除

需要强调的是,接收端MQ-clientACK给服务端MQ-server,是消息消费业务方的主动调用行为,不能由MQ-client自动发起,因为MQ系统不知道消费方什么时候真正消费成功。

如果5丢失,服务端MQ-server超时后会重发消息,可能导致MQ-client收到重复的消息

 

此时重发是MQ-server发起的消息的处理是消息消费业务方,消息重发势必导致业务方重复消费(上例中的一次付款,重复发卡),为了保证业务幂等性,业务消息体中,必须有一个biz-id,作为去重和幂等的依据,这个业务ID的特性是:

1)对于同一个业务场景,全局唯一

2)由业务消息发送方生成,业务相关,对MQ透明

3)由业务消息消费方负责判重,以保证幂等

 

最常见的业务ID有:支付ID,订单ID,帖子ID等。

 

具体到支付购卡场景,发送方必须将支付ID放到消息体中,消费方必须对同一个支付ID进行判重,保证购卡的幂等。

 

有了这个业务ID,才能够保证下半场消息消费业务方即使收到重复消息,也只有1条消息被消费,保证了幂等。

 

三、总结

MQ为了保证消息必达,消息上下半场均可能发送重复消息,如何保证消息的幂等性呢?

上半场

MQ-client生成inner-msg-id,保证上半场幂等

这个ID全局唯一,业务无关,由MQ保证。

 

下半场

业务发送方带入biz-id,业务接收方去重保证幂等

这个ID对单业务唯一,业务相关,对MQ透明。


结论:幂等性,不仅对MQ有要求,对业务上下游也有要求。


能听懂的Java面向对象编程

通过本课程的学习,学生能掌握面向对象的程序设计思想,并能运用Java技术和相关开发工具进行计算机软件代码的设计。 课程内容并非参考书式的简单罗列,而是结合项目实际,讲解项目中常用的知识。那些较少使用且难于理解的内容在本课程中并未涉及。这样既能降低学员学习难度、增强学员学习的信心又能利用所学知识做出像样的项目,让学员对开发有一个整体认识,在此基础上添砖加瓦丰富其它知识点
  • 2017年03月16日 08:49

消息总线真的能保证幂等

一、缘起 如《消息总线消息必达》所述,MQ消息必达,架构上有两个核心设计点: (1)消息落地 (2)消息超时、重传、确认   再次回顾消息总线核心架构,它由发...
  • wufaliang003
  • wufaliang003
  • 2017-10-27 14:54:06
  • 61

MQ消息架构设计三(消息总线真的能保证幂等?)

转载自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651960002&idx=1&sn=c0775231bccf002c3178ea...
  • zenghaolin510824
  • zenghaolin510824
  • 2017-11-24 10:56:24
  • 300

消息总线(MQ)知多少

1 什么时候用MQ?1.1 MQ的基本概念  消息总线(Message Queue,MQ),是一种跨进程的通信机制,用于在上下游之间传递消息。MQ是一种常见的上下游“逻辑解耦+物理解耦”的消息通信服务...
  • u010255818
  • u010255818
  • 2017-09-05 21:39:23
  • 4064

如何保证微服务接口的幂等性

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了...
  • WANGYAN9110
  • WANGYAN9110
  • 2017-04-29 15:48:21
  • 4193

高并发下的幂等策略分析

转载至:http://www.guokr.com/article/47868/?f=wx&page=2 双十一,零点刚开始,小明就迫不及待地点击提交订单按钮,1秒,2秒,3秒,没反应,小...
  • aly1989
  • aly1989
  • 2016-08-29 14:21:10
  • 3123

接口幂等的重要性

接口幂等是说,用相同的参数,调用一次和调用多次,其返回的结果应该是一样的。比如一个接口时用来保存数据的,那如果用户在页面上,连续两次点击提交(点击提交后,页面加遮罩层除外),那势必会发送2次请求,如果...
  • mzh1992
  • mzh1992
  • 2017-01-04 16:01:22
  • 1868

HTTP幂等性及注意事项

幂等性——是系统的接口对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。 转知乎(Ivony)一个回答: 一个幂等的操作典型如: 把编号为5的记录的A字...
  • soonfly
  • soonfly
  • 2016-10-12 09:58:20
  • 1525

使用redis设计幂等接口

幂等: 幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的. 声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试 举个例子: ...
  • daiyudong2020
  • daiyudong2020
  • 2016-06-25 19:17:26
  • 2891

必测的支付漏洞(二)支付流程中“幂等性”

看到这个标题,你们一定一脸懵逼吧哈哈哈~最近拜读了一篇很棒的文章,学习到了计算机中的一种思想——幂等性。然后联想到了之前测支付漏洞时的一个测试点,今天用本文跟大家分享一下幂等性这种思想吧~ 幂等性其实...
  • github_36032947
  • github_36032947
  • 2017-10-29 17:22:34
  • 1817
收藏助手
不良信息举报
您举报文章:消息总线真的能保证幂等?
举报原因:
原因补充:

(最多只允许输入30个字)