Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 何时使用直接交换而不是扇出交换_Rabbitmq_Amqp - Fatal编程技术网

Rabbitmq 何时使用直接交换而不是扇出交换

Rabbitmq 何时使用直接交换而不是扇出交换,rabbitmq,amqp,Rabbitmq,Amqp,据我所知,直接交换没有合适的用例,因为你可以用它做的任何事情都可以用扇出交换来做,只是扩展性更强 更具体地说,在实际阅读RabbitMQ时,作者大量引用了如下用例-“假设当用户上传图片时,您需要生成缩略图。但后来的市场营销也会告诉你上传照片要奖励积分。使用RabbitMQ,您只需创建另一个队列,而不必在生产者端执行任何操作!" 但只有当您有远见在生产者端创建扇出交换时,这才是正确的。据我所知,直接交换无法实现这一点,只有在您确实需要交换和队列之间的紧密耦合时才合适(您不需要,因为这是消息传递系统

据我所知,直接交换没有合适的用例,因为你可以用它做的任何事情都可以用扇出交换来做,只是扩展性更强

更具体地说,在实际阅读RabbitMQ时,作者大量引用了如下用例-“假设当用户上传图片时,您需要生成缩略图。但后来的市场营销也会告诉你上传照片要奖励积分。使用RabbitMQ,您只需创建另一个队列,而不必在生产者端执行任何操作!"

但只有当您有远见在生产者端创建扇出交换时,这才是正确的。据我所知,直接交换无法实现这一点,只有在您确实需要交换和队列之间的紧密耦合时才合适(您不需要,因为这是消息传递系统的重点)


这是正确的还是有实际的使用案例?

你是指扇出交换还是主题交换?扇出交换与直接交换有很大的不同。我假设将照片发送到交换是使用指定有照片的路由密钥发送的。在这种情况下,您有一个生成缩略图的消费者d当你想添加一个新的消费者时,你可以添加它,得到相同的信息,但做一些不同的事情,即奖励积分


用例是成立的。我认为重点是交换最初是作为直接交换创建的。

这个答案与前面的答案相呼应,如果你提到这个,我相信你会发现描述的一个特定用例是:

直接交换通常用于在多个服务器之间分配任务 工人(同一应用程序的实例)以循环方式


与扇出交换相比,直接交换允许基于消息的路由密钥进行一些筛选,以确定哪些队列接收消息。使用扇出交换,不存在此类筛选,所有消息都将转到所有绑定的队列

因此,如果您有一个直接交换,其中多个队列使用相同的路由密钥绑定,并且所有消息都有此密钥,那么您的行为与扇出交换相同。这在中有更好的解释

在图像上载用例中,您可以使用:

  • 具有两个队列(一个用于缩略图工作程序,一个用于分数计算工作程序)的扇出交换。忽略路由键

    fanout-exchange
    |--> queue --> thumbnail-worker
    `--> queue --> score-worker
    
  • 与两个队列的直接交换。例如,队列用
    图像处理
    键绑定,带有此键的消息将排队到两个队列

    direct-exchange
    |--["image-processing"]--> queue --> thumbnail-worker
    `--["image-processing"]--> queue --> score-worker
    
    当然,在这种情况下,如果消息的路由密钥与绑定密钥不匹配,则所有队列都不会接收消息


您不能将两个工作进程放在同一队列上,因为消息将在它们之间进行负载平衡:一个工作进程将看到一半的消息。

文档中的这句话令人困惑。事实上,如果您将具有相同路由密钥的多个队列绑定到直接交换,如果路由密钥匹配,它们都将接收消息。这在中有更好的解释。@Jean-SébastienPédron-我和你一样感到困惑,但是阅读下一条语句实际上消除了这种困惑-
“在这样做时,重要的是要理解,在AMQP 0-9-1中,消息在消费者之间而不是队列之间是负载平衡的。“
这本质上意味着负载平衡发生在队列的消费端。只是进入rabbitMQ——似乎如果消费进程受到限制和理解,那么直接交换是一种更可读和更明确的选择,而不是必须跟踪绑定到弹出式交换的工人。