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

时间:2015-04-14 20:58:25

标签: web-services message-queue distributed-system

我正在设计一个涉及两个服务A和B的基于事件的系统。

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

正如我所看到的,有两种方法可以解决这个问题:

  1. 服务A发送的消息包含已更改的资源字段及其更改的内容。当服务B使用此消息时,它使用该信息来确定其资源的状态。
  2. 服务A发送的消息仅包含指向已更改资源的链接。当服务B使用此消息时,它会调用该链接以检索A的资源的当前状态以供其自己处理。
  3. 您认为哪种方法更合适?我倾向于#1,因为消息的接收者不需要可能具有服务B的带外知识(是的,它有一个链接,但它可能没有正确的头,正确的HTTP动词等),并减少服务喋喋不休。

    任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

两者都是可行的选择。您选择哪个版本取决于多个方面。

  • 查找资源有多贵?如果价格昂贵,那么请倾向于选项1。
  • 在队列上发送更改有多贵?选项1发送差异,如果差异很大,则可能会变得昂贵。选项2仅发送到资源的链接。第三个选项是store the diff as a resource
  • 系统可以处理资源的多项更改吗?例如,资源可以在A发送通知的时间和系统B读取资源之间多次改变。如果系统可以处理此问题,则选项2有机会忽略某些更新,从而可能减少处理。如果系统无法处理此问题,则必须使用选项1。