Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RabbitMQ/AMQP设计:如何让一些消息由一个使用者处理,但却观察到所有使用者?_Rabbitmq_Amqp - Fatal编程技术网

RabbitMQ/AMQP设计:如何让一些消息由一个使用者处理,但却观察到所有使用者?

RabbitMQ/AMQP设计:如何让一些消息由一个使用者处理,但却观察到所有使用者?,rabbitmq,amqp,Rabbitmq,Amqp,我有一个具有3个实例/副本的应用程序(同时运行3个同类应用程序)。它们都使用相同的队列,因此RabbitMQ以循环方式传递消息。所有三个实例都共享一个它们r/w到的数据库 当队列接收到(比方说,newuser消息,并将其传递给一个实例,该实例将用户保存到公共数据库时,这种方法非常有效 问题是: 给定一条消息newuser,我希望有一个实例将其保存到数据库中(与以前一样),但现在我希望所有三个实例都使其缓存无效。因此,我实际上需要所有实例接收相同的事件,但其中只有一个实例的行为不同 如何设计一个满

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

当队列接收到(比方说,
newuser
消息,并将其传递给一个实例,该实例将用户保存到公共数据库时,这种方法非常有效

问题是: 给定一条消息
newuser
,我希望有一个实例将其保存到数据库中(与以前一样),但现在我希望所有三个实例都使其缓存无效。因此,我实际上需要所有实例接收相同的事件,但其中只有一个实例的行为不同

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


我能想到的最好的方法是进行两次交换(
fanout
direct
),将
新用户
消息发送到一个单独的应用程序,该应用程序复制该消息并将其发送到
fanout
direct
交换。所有实例都侦听这两个交换,并根据消息处理程序决定要执行的操作(如果消息来自
fanout
exchange:使缓存无效,如果它来自
direct
exchange,那么,无论如何只有一个实例会收到它)。

您的方法可能有问题。如果来自
fanout
交换的消息将在实际创建
用户之前到达
,则您的实例可能过早地使缓存无效。
我认为你应该做以下几点:

  • 拥有
    direct
    exchange和worker队列,您的所有用户创建者都可以像现在这样循环接收消息
  • 当实例创建了一个用户时,它会将一条消息
    user created
    发送到
    主题
    扇出
    交换,所有用户创建者都在那里收听。然后,所有实例(包括发送方)将接收用户创建的
    事件,并使其缓存无效