什么时候使用直接交换超过扇出交换

时间:2013-02-26 23:41:17

标签: rabbitmq amqp

据我所知,直接交换没有合适的用户案例,因为您可以使用它进行任何操作,您可以使用扇出交换,只能更加扩展。

更具体地说,在阅读 RabbitMQ in Action 时,作者多次提到类似的用例 - “假设用户上传图片时需要生成缩略图。但后来营销也是如此告诉你奖励上传照片的积分。使用RabbitMQ你只需要创建另一个队列而不在制作人那边工作!“

但如果你有远见在制作人那边创建一个扇出交换,那么只有才是真的。根据我的理解,直接交换不能实现这一点,只有当你真正想要交换和队列之间的紧密耦合时才适用(你不这样做,因为这是消息传递系统的重点。)

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

3 个答案:

答案 0 :(得分:11)

与扇出交换相比,直接交换允许基于消息的路由密钥进行一些过滤以确定哪个(哪些)队列接收消息。通过扇出交换,没有这样的过滤,所有消息都会到达所有绑定队列。

因此,如果您与使用相同路由队列绑定的多个队列进行直接交换,并且所有消息都具有此密钥,那么您具有与扇出交换相同的行为。在tutorial 4 on the RabbitMQ website中可以更好地解释这一点。

在图片上传用例中,您可以使用:

  • 有两个队列的扇出交换(一个用于缩略图工作者,一个用于分数计算工作者)。路由密钥被忽略。

    fanout-exchange
    |--> queue --> thumbnail-worker
    `--> queue --> score-worker
    
  • 再次与两个队列进行直接交流。例如,队列与image-processing键绑定,具有此键的消息将排队到两个队列。

    direct-exchange
    |--["image-processing"]--> queue --> thumbnail-worker
    `--["image-processing"]--> queue --> score-worker
    

    当然,在这种情况下,如果邮件的路由密钥与绑定密钥不匹配,则所有队列都不会收到该邮件。

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

答案 1 :(得分:0)

你的意思是粉丝交换或主题交换?扇出交换与直接交换非常不同。我认为将照片发送到交易所会发送一个指定有照片的路由键。在这种情况下,您有一个生成缩略图的消费者,当您想要添加新消费者时,您只需添加它并获得相同的消息,但可以使用它做一些不同的事情,即奖励积分。

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

答案 2 :(得分:0)

这个答案与之前的答案相呼应,如果您参考此page,我相信您所描述的一个特定用例是:

  

直接交换通常用于在多个之间分配任务   工人(同一申请的实例)以循环方式。