RabbitMQ / AMQP设计:如何让一个消费者处理一些消息,并观察所有消费者?

时间:2017-12-12 17:51:45

标签: rabbitmq amqp

我有一个具有3个实例/副本的应用程序(同时运行三个相同类型的应用程序)。它们都使用相同的队列,因此RabbitMQ以循环方式传递消息。这三个实例共享一个他们可以访问的数据库。

当队列接收到new-user消息,将其传递给一个实例,并且该实例将用户保存到公共数据库时,这非常有用。

问题: 给定一条消息new-user,我想要一个实例将它保存到数据库中(如前所述),但现在我希望所有三个实例都使它们的缓存无效。所以我实际上需要所有实例接收相同的事件,但只有其中一个以不同的方式行事。

如何设计允许这些要求的系统?

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

1 个答案:

答案 0 :(得分:2)

您的方法可能存在问题。如果来自fanout exchange的邮件将在before实际创建,则您的实例可能会过早地使缓存失效。 我认为你应该做到以下几点:

  • 让所有用户创建者以循环方式获取邮件的direct交换和工作人员队列,就像您现在拥有的一样。
  • 当实例创建用户时,它会向user createdtopic交换机发送消息fanout,其中所有用户创建者都在监听。然后,所有实例(包括发件人)都将收到user created事件,并使其缓存无效。