我有一个具有3个实例/副本的应用程序(同时运行三个相同类型的应用程序)。它们都使用相同的队列,因此RabbitMQ以循环方式传递消息。这三个实例共享一个他们可以访问的数据库。
当队列接收到new-user
消息,将其传递给一个实例,并且该实例将用户保存到公共数据库时,这非常有用。
问题:
给定一条消息new-user
,我想要一个实例将它保存到数据库中(如前所述),但现在我希望所有三个实例都使它们的缓存无效。所以我实际上需要所有实例接收相同的事件,但只有其中一个以不同的方式行事。
如何设计允许这些要求的系统?
我能想到的最好的方法是将两个交换(fanout
和direct
),new-user
消息发送到一个单独的应用程序,该应用程序将其复制并发送给{ {1}}和fanout
次交流。所有实例都会监听两个交换,并根据消息处理程序决定要做什么(如果消息来自direct
交换:使缓存无效,如果它来自fanout
交换,那么,只有一个无论如何都会收到它。
答案 0 :(得分:2)
您的方法可能存在问题。如果来自fanout
exchange的邮件将在before
实际创建,则您的实例可能会过早地使缓存失效。
我认为你应该做到以下几点:
direct
交换和工作人员队列,就像您现在拥有的一样。user created
或topic
交换机发送消息fanout
,其中所有用户创建者都在监听。然后,所有实例(包括发件人)都将收到user created
事件,并使其缓存无效。