1、MQ消息发送html
一、发送端MQ-client(消息生产者:Producer)将消息发送给MQ-server;网络
二、MQ-server将消息落地;异步
三、MQ-server回ACK给MQ-client(Producer);spa
四、MQ-server将消息发送给消息接受端MQ-client(消息消费者:Customer);日志
五、MQ-client(Customer)消费接受到消息后发送ACK给MQ-server;server
六、MQ-server将落地消息删除htm
2、消息重复发送缘由blog
为了保证消息必达,MQ使用了消息超时、重传、确认机制。使得消息可能被重复发送,如上图中,因为网络不可达缘由:3和5中断,可能致使消息重发。消息生产者a收不到MQ-server的ACK,重复向MQ-server发送消息。MQ-server收不到消息消费者b的ACK,重复向消息消费者b发消息。it
3、消息重复发送产生的后果class
举个例子:购买会员卡,上游支付系统负责给用户扣款,下游系统负责给用户发卡,经过MQ异步通知。无论是上半场的ACK丢失,致使MQ收到重复的消息,仍是下半场ACK丢失,致使购卡系统收到重复的购卡通知,均可能出现,上游扣了一次钱,下游发了多张卡。
4、MQ内部如何作到幂等性的
对于每条消息,MQ内部生成一个全局惟1、与业务无关的消息ID:inner-msg-id。当MQ-server接收到消息时,先根据inner-msg-id判断消息是否重复发送,再决定是否将消息落地到DB中。这样,有了这个inner-msg-id做为去重的依据就能保证一条消息只能一次落地到DB。
5、消息消费者应当如何作到幂等性
一、对于非幂等性业务且要求实现幂等性业务:生成一个惟一ID标记每一条消息,将消息处理成功和去重日志经过事物的形式写入去重表。
二、对于非幂等性业务可不实现幂等性的业务:权衡去重所花的代价决定是否须要实现幂等性,如:购物会员卡成功,向用户发送通知短信,发送一次或者屡次影响不大。不作幂等性能够省掉写去重日志的操做。