0

我目前在微服务中使用事件驱动架构。我有一个与基于事件的系统有关的问题:

例如,假设我有一个对 ProfileChangeEvent 做出反应的 Person 模型(包含 Person 需要更新的名称)。现在我在步骤中有以下情况:

  1. 将配置文件名称更改为“Mike”并使用 name='Mike' 发布 ProfileChangeEvent
  2. 再次将配置文件名称更改为 'Micheal' 并使用 name='Michael' 发布 ProfileChangeEvent
  3. 这两个事件以正确的顺序到达,但第一个事件处理失败,事件最终进入死信队列(DLQ),最终人的名字是“迈克尔”,因为第二个事件消费成功。
  4. 一段时间后,我注意到 DLQ 中的第一个失败事件并重新发布它并且消费成功,现在人的名字是“迈克”,这是不正确的,因为“迈克尔”实际上是最近更新的值。

请提供有关如何处理此类情况的建议?

4

1 回答 1

0

您必须跟踪源和目标数据存储中的文档版本并将其发布到事件中:

Publish ProfileChangeEvent ({name:'Mike', documentVersion:1})
Publish ProfileChangeEvent ({name:'Michael', documentVersion:2})

消费服务必须跟踪它处理的版本。如果它已经处理了它的前身,它只能处理一个新版本。

因此,如果出现“Michael”,如果“Mike”尚未处理,您可以拒绝处理。

于 2020-12-02T12:09:25.203 回答