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

dje*_*lin 12 amqp rabbitmq

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

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

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

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

Jea*_*ron 14

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

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

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

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

    fanout-exchange
    |--> queue --> thumbnail-worker
    `--> queue --> score-worker
    
    Run Code Online (Sandbox Code Playgroud)
  • 再次与两个队列直接交换.image-processing例如,队列与密钥绑定,具有此密钥的消息将排队到两个队列.

    direct-exchange
    |--["image-processing"]--> queue --> thumbnail-worker
    `--["image-processing"]--> queue --> score-worker
    
    Run Code Online (Sandbox Code Playgroud)

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

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


rob*_*olf 0

你指的是扇出交换还是主题交换?扇出交换与直接交换有很大不同。我认为将照片发送到交易所是通过指定有照片的路由密钥发送的。在这种情况下,您有一个生成缩略图的消费者,当您想要添加新消费者时,您只需添加它并获取相同的消息,但对其执行不同的操作,即奖励积分。

该用例成立。我认为重点在于,该交易所最初是作为直接交易所创建的。