RabbitMQ / AMQP 设计:我如何让一些消息由一个消费者处理,但观察所有消费者?
RabbitMQ / AMQP design: How can I have some messages to be processed by one consumer, and but observed all consumers?
我有一个应用程序有 3 个 instances/replicas(三个相同类型的应用程序同时 运行)。它们都使用相同的队列,因此 RabbitMQ 以循环方式传递消息。所有三个实例共享一个数据库,它们 r/w 到。
当队列接收到 new-user
消息,将其传送到一个实例,然后该实例将用户保存到公共数据库时,这非常有效。
问题:
给定一条消息 new-user
,我希望一个实例将其保存到数据库(和以前一样),但现在我希望所有三个都使它们的缓存无效。所以我实际上需要所有实例都接收相同的事件,但只有其中一个实例的行为不同。
如何设计满足这些要求的系统?
我能想到的最好的方法是进行两次交换(fanout
和 direct
),new-user
消息被发送到一个单独的应用程序,该应用程序复制并发送它到 fanout
和 direct
交流。所有实例都监听两个交换器,并根据消息处理程序决定要做什么(如果消息来自 fanout
交换器:使缓存无效,如果它来自 direct
交换器,那么,只有一个无论如何都会收到的)。
您的方法可能有问题。如果来自 fanout
交换的消息将到达 before
用户实际创建,您的实例可能过早地使缓存无效。
我认为您应该执行以下操作:
- 拥有
direct
交换器和工作队列,您的所有用户创建者都在其中以循环方式接收消息,就像您现在拥有的那样。
- 实例创建用户时,它会向
topic
或 fanout
交换器发送一条消息 user created
,所有用户创建者都在其中收听。然后所有实例(包括发送方)都将收到 user created
事件并使它们的缓存无效。
我有一个应用程序有 3 个 instances/replicas(三个相同类型的应用程序同时 运行)。它们都使用相同的队列,因此 RabbitMQ 以循环方式传递消息。所有三个实例共享一个数据库,它们 r/w 到。
当队列接收到 new-user
消息,将其传送到一个实例,然后该实例将用户保存到公共数据库时,这非常有效。
问题:
给定一条消息 new-user
,我希望一个实例将其保存到数据库(和以前一样),但现在我希望所有三个都使它们的缓存无效。所以我实际上需要所有实例都接收相同的事件,但只有其中一个实例的行为不同。
如何设计满足这些要求的系统?
我能想到的最好的方法是进行两次交换(fanout
和 direct
),new-user
消息被发送到一个单独的应用程序,该应用程序复制并发送它到 fanout
和 direct
交流。所有实例都监听两个交换器,并根据消息处理程序决定要做什么(如果消息来自 fanout
交换器:使缓存无效,如果它来自 direct
交换器,那么,只有一个无论如何都会收到的)。
您的方法可能有问题。如果来自 fanout
交换的消息将到达 before
用户实际创建,您的实例可能过早地使缓存无效。
我认为您应该执行以下操作:
- 拥有
direct
交换器和工作队列,您的所有用户创建者都在其中以循环方式接收消息,就像您现在拥有的那样。 - 实例创建用户时,它会向
topic
或fanout
交换器发送一条消息user created
,所有用户创建者都在其中收听。然后所有实例(包括发送方)都将收到user created
事件并使它们的缓存无效。