据我所知,直接交换没有合适的用户案例,因为您可以使用扇出交换进行任何操作,但只能扩展得多。
更具体地说,在阅读《 RabbitMQ in Action》时,作者多次提到用例,例如:“假设用户上传图片时,您需要生成缩略图。但是随后的营销也告诉您,为上传图片而奖励积分。使用RabbitMQ,您只需要创建另一个队列,而在生产者端则无需任何工作!”
但这只有在您具有远见卓识的情况下才能在制作方建立扇出交流时才是正确的。据我了解,直接交换无法完成此任务,仅在您实际上希望交换和队列之间紧密耦合时才适用(您不这样做,因为那是消息传递系统的重点)。
这是正确的还是有实际的用例?
最佳答案
与扇出交换相比,直接交换允许基于消息的路由密钥进行一些筛选,以确定哪些队列接收消息。使用扇出交换时,不会进行此类过滤,并且所有消息都将进入所有绑定的队列。
因此,如果您与绑定了同一路由密钥的多个队列进行直接交换,并且所有消息都具有此密钥,那么您的行为与扇出交换相同。 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
当然,在这种情况下,如果消息的路由密钥与绑定密钥不匹配,则所有队列都不会收到该消息。
您不能将两个工作程序放在同一队列中,因为消息将在它们之间进行负载平衡:一个工作程序将看到一半的消息。
关于rabbitmq - 何时通过扇出交换使用直接交换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15101640/