幂等消费模式 - Pradeep Loganathan


事件驱动架构是一个分布式系统,而分布式系统是天生网络不可靠。这需要在发生故障时计划进行重试,但是重试会导致重复记录,某人帐户中支付两次付款是不可原谅的。
为了避免多次处理事件,我们需要应用Exactly-once语义。如果消息处理系统和消息消费者之间没有某种合作,就不可能保证完全一次处理。如果消息系统有对消息发布者发布消息的确认机制,,那么每个消息必须具有唯一ID以供消息系统进行重复数据删除。在消费者这边也可以实现,重复数据删除可用于确保不处理重复消息。消费逻辑需是幂等的。
本质上,幂等意味着当多次接收到相同的事件/消息时,对于接收者的状态没有变化。以下是一些方法:

  • 通过按身份标识ID重复消息来重复传入消息。
  • 设计状态切换来表示消息的接受,以便在每次收到相同消息时产生相同影响。
  • 收到重复消息允许状态切换产生无害影响。

幂等消费者模式就像一个有状态过滤器,它允许由它包装的逻辑只执行一次。实现这个需要两个元素:
  • 一种通过业务键唯一标识key每条消息的方法。
  • 幂等存储库。幂等存储库是一组持久Key的容器,它们将在消费者重新启动后继续存在,并且可以在数据库表,日记帐或类似工具中实现。

当事件到达时,消费者需要使用分配给事件的事件key来唯一地识别它。检查幂等存储库以查看它是否包含key,如果不包含,则执行由其包装的逻辑,否则将跳过该逻辑。
许多消息传递系统,例如Apache ActiveMQ,Apache Kafka,Apache Camel都具有消除重复消息的功能。Idempotent消费者模式用于在这些系统中提供这种功能。