20

据我所知,直接交换没有合适的用例,就像你可以用它做的任何事情一样,你可以用扇出交换来做,只是更具可扩展性。

更具体地说,在阅读RabbitMQ in Action时,作者大量引用了类似的用例 - “假设当用户上传图片时,您需要生成缩略图。但后来营销还告诉您上传一个奖励积分照片。使用 RabbitMQ,您只需要创建另一个队列,并且在生产者端不做任何工作!”

但这只有在您有远见在生产者方面创建一个扇出交换时才是正确的。据我了解,直接交换无法实现这一点,并且仅在您真正想要交换和队列之间的紧密耦合时才适用(您不需要,因为这是消息传递系统的重点。)

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

4

3 回答 3

22

与扇出交换相比,直接交换允许根据消息的路由键进行一些过滤,以确定哪个队列接收消息。使用扇出交换,没有这样的过滤,所有消息都进入所有绑定队列。

因此,如果您与多个使用相同路由键绑定的队列进行直接交换,并且所有消息都具有此键,那么您将具有与扇出交换相同的行为。这在 RabbitMQ 网站上的教程 4 中有更好的解释。

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

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

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

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

    当然,在这种情况下,如果消息的路由键与绑定键不匹配,则任何队列都不会收到该消息。

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

于 2016-03-24T10:41:54.397 回答
0

你的意思是扇出交换还是主题交换?扇出交换与直接交换非常不同。我假设将照片发送到交易所是使用指定有照片的路由键发送的。在这种情况下,您有一个生成缩略图的消费者,当您想添加一个新消费者时,您可以添加它并获得相同的消息,但对其执行不同的操作,即奖励积分。

用例成立。我认为关键是交易所最初是作为直接交易所创建的。

于 2013-02-27T07:40:46.777 回答
0

这个答案与上一个答案相呼应,如果您参考此页面,我相信您会发现所描述的一个特定用例是:

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

于 2013-08-12T11:02:43.137 回答