消息总线和事件——如何应对?

Message Bus and Events - How to React?

我正在设计一个涉及两个服务 A 和 B 的 event-based 系统。

当用户使用 PUT 更新服务 A 中的资源时,该服务将向消息 queue 发送通知。服务 B 从中读取 queue,然后必须根据 A 中资源发生的变化更新其资源之一的状态。

据我所知,有两种方法可以解决这个问题:

  1. 服务A发送的消息中包含发生变化的资源字段,以及变化的源和目标。当服务 B 使用此消息时,它使用该信息来确定其资源的状态。
  2. 服务 A 发送的消息仅包含 link 到已更改的资源。当服务 B 使用此消息时,它会调用 link 来检索 A 资源的当前状态以供自己处理。

大家觉得哪种方式更令人满意呢?我倾向于#1,因为消息的接收者可能不需要 out-of-band 服务 B 的知识(是的,它有一个 link 但它可能没有正确的 headers,正确的 HTTP 动词等),并减少服务聊天量。

如有任何想法,我们将不胜感激!

两者都是可行的选择。您选择哪个版本取决于多种因素。

  • 查找资源的费用是多少?如果贵,就倾向于方案一。
  • 在队列中发送更改的成本是多少?选项 1 发送一个差异,如果差异很大,它可能会变得昂贵。选项 2 仅向资源发送 link。第三个选项是 store the diff as a resource.
  • 系统能否处理对资源的多次更改?例如,资源可能在 A 发送通知和系统 B 读取资源之间发生多次更改。如果系统可以处理这个,选项 2 有机会忽略一些更新,可能会减少处理。如果系统无法处理,您必须使用选项 1。