据我所知,直接交换没有合适的用户案例,因为您可以使用它进行任何操作,您可以使用扇出交换,只能更加扩展。
更具体地说,在阅读 RabbitMQ in Action 时,作者多次提到类似的用例 - “假设用户上传图片时需要生成缩略图。但后来营销也是如此告诉你奖励上传照片的积分。使用RabbitMQ你只需要创建另一个队列而不在制作人那边工作!“
但如果你有远见在制作人那边创建一个扇出交换,那么只有才是真的。根据我的理解,直接交换不能实现这一点,只有当你真正想要交换和队列之间的紧密耦合时才适用(你不这样做,因为这是消息传递系统的重点。)
这是正确的还是有实际用例?
答案 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,我相信您所描述的一个特定用例是:
直接交换通常用于在多个之间分配任务 工人(同一申请的实例)以循环方式。