【发布时间】:2018-10-05 16:33:54
【问题描述】:
假设我们有一个系统,其中有一个生产者将消息排入队列,并且同一消费者的多个实例处理此事件。 由于我们处于竞争消费者模式,我们知道不再保证订购。这意味着我们必须确保我们的消息是幂等的。
根据我读到的here(在消息排序要点下),我们必须确保消息处理是幂等的。
问题如下:
- 我们如何将消息处理设计为幂等的?
- 如果我们将每个事件保存在事件存储中,在设计每个事件的有效负载和事件聚合以获得聚合状态时是否需要考虑任何因素?
一个例子:假设我们有一条“用户已创建”和“用户已删除”消息(或任何其他需要按顺序处理的事件)。如果我们在“用户创建”之前处理“用户已删除”,则不会删除用户。即使他们在事件队列中排序。幂等处理/幂等事件真的可以给已删除的用户吗?
另一个例子。
假设我们有一个具有score 属性的实体。用户可以修改分数。第二个服务使用“得分实体”服务的事件,如果得分达到 100,则该实体(或实体引用)由第二个服务插入“最佳类别”实体中。如果分数达到-20,则第二个服务将分数实体插入“更差类别”中。如果“score 100”和“score -20”事件发生在很短的时间间隔内,那么拥有第二个服务的多个实例可能会产生不可预测的结果。关于如何设计“score x”事件或如何处理这些事件的任何想法?
非常感谢您的帮助!
【问题讨论】:
标签: events messaging event-sourcing idempotent