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,我希望一个实例将其保存到数据库(和以前一样),但现在我希望所有三个都使它们的缓存无效。所以我实际上需要所有实例都接收相同的事件,但只有其中一个实例的行为不同。

如何设计满足这些要求的系统?

我能想到的最好的方法是进行两次交换(fanoutdirect),new-user 消息被发送到一个单独的应用程序,该应用程序复制并发送它到 fanoutdirect 交流。所有实例都监听两个交换器,并根据消息处理程序决定要做什么(如果消息来自 fanout 交换器:使缓存无效,如果它来自 direct 交换器,那么,只有一个无论如何都会收到的)。

您的方法可能有问题。如果来自 fanout 交换的消息将到达 before 用户实际创建,您的实例可能过早地使缓存无效。 我认为您应该执行以下操作:

  • 拥有 direct 交换器和工作队列,您的所有用户创建者都在其中以循环方式接收消息,就像您现在拥有的那样。
  • 实例创建用户时,它会向 topicfanout 交换器发送一条消息 user created,所有用户创建者都在其中收听。然后所有实例(包括发送方)都将收到 user created 事件并使它们的缓存无效。