我的架构梦:(八十八)消息中间件之Kafka如何保证幂等性

一、幂等性

保证在消息重发的时候,消费者不会重复处理。即使在消费者收到重复消息的时候,重复处理,也要保证最终结果的一致性。

所谓幂等性,数学概念就是: f(f(x)) = f(x) 。f函数表示对消息的处理。

比如,银行转账,如果失败,需要重试。不管重试多少次,都要保证最终结果一定是一致的。

二、引入幂等性之前

Producer向Broker发送消息,然后Broker将消息追加到消息流中后再给Producer返回Ack信号值。实现流程如下:

我的架构梦:(八十八)消息中间件之Kafka如何保证幂等性

生产中,会出现各种不确定的因素,比如在Producer在发送给Broker的时候出现网络异常。比如以下这种异常情况的出现:

我的架构梦:(八十八)消息中间件之Kafka如何保证幂等性

上图这种情况,当Producer第一次发送消息给Broker时,Broker将消息(x2,y2)追加到了消息流中, 但是在返回Ack信号给Producer时失败了(比如网络异常) 。此时,Producer端触发重试机制,将消息 (x2,y2)重新发送给Broker,Broker接收到消息后,再次将该消息追加到消息流中,然后成功返回Ack信号给Producer。这样下来,消息流中就被重复追加了两条相同的(x2,y2)的消息。

三、引入幂等性之后

添加唯一ID,类似于

上一篇:论Kafka的整体流程


下一篇:JAVA代码之RocketMQ生产和消费数据