RabbitMQ/AMQP设计:如何让一些消息由一个使用者处理,但却观察到所有使用者?
我有一个具有3个实例/副本的应用程序(同时运行3个同类应用程序)。它们都使用相同的队列,因此RabbitMQ以循环方式传递消息。所有三个实例都共享一个它们r/w到的数据库 当队列接收到(比方说,RabbitMQ/AMQP设计:如何让一些消息由一个使用者处理,但却观察到所有使用者?,rabbitmq,amqp,Rabbitmq,Amqp,我有一个具有3个实例/副本的应用程序(同时运行3个同类应用程序)。它们都使用相同的队列,因此RabbitMQ以循环方式传递消息。所有三个实例都共享一个它们r/w到的数据库 当队列接收到(比方说,newuser消息,并将其传递给一个实例,该实例将用户保存到公共数据库时,这种方法非常有效 问题是: 给定一条消息newuser,我希望有一个实例将其保存到数据库中(与以前一样),但现在我希望所有三个实例都使其缓存无效。因此,我实际上需要所有实例接收相同的事件,但其中只有一个实例的行为不同 如何设计一个满
newuser
消息,并将其传递给一个实例,该实例将用户保存到公共数据库时,这种方法非常有效
问题是:
给定一条消息newuser
,我希望有一个实例将其保存到数据库中(与以前一样),但现在我希望所有三个实例都使其缓存无效。因此,我实际上需要所有实例接收相同的事件,但其中只有一个实例的行为不同
如何设计一个满足这些要求的系统
我能想到的最好的方法是进行两次交换(
fanout
和direct
),将新用户
消息发送到一个单独的应用程序,该应用程序复制该消息并将其发送到fanout
和direct
交换。所有实例都侦听这两个交换,并根据消息处理程序决定要执行的操作(如果消息来自fanout
exchange:使缓存无效,如果它来自direct
exchange,那么,无论如何只有一个实例会收到它)。您的方法可能有问题。如果来自fanout
交换的消息将在实际创建用户之前到达,则您的实例可能过早地使缓存无效。
我认为你应该做以下几点:
- 拥有
direct
exchange和worker队列,您的所有用户创建者都可以像现在这样循环接收消息
- 当实例创建了一个用户时,它会将一条消息
user created
发送到主题
或扇出
交换,所有用户创建者都在那里收听。然后,所有实例(包括发送方)将接收用户创建的事件,并使其缓存无效