direct、topic、fanout的使用以及区别

在rabbitmq中有许多交换机,不同的交换机适用于不同的场景。如下:

这么多交换机中,最常用的交换机有三种:direct、topic、fanout。我分别叫他们:“直接连接交换机”,“主题路由匹配交换机”,“无路由交换机”。以下是详细的介绍:

Direct 交换机

这个交换机就是一个直接连接交换机,什么叫做直接连接交换机呢?

所谓“直接连接交换机”就是:Producer(生产者)投递的消息被DirectExchange (交换机)转发到通过routingkey绑定到具体的某个Queue(队列),把消息放入队列,然后Consumer从Queue中订阅消息。

消费端:

生产端:

我启动生产者和消费者,可以看到服务已经被消费。如下图:

在管控台Exchange中可以看到多了一个交换机:

点击testDirectExchange中Bindings可以看到我们的Routingkey:testDirect和绑定的队列test002

点击test002可以快速进入到队列中,点击binding可以查看到队列绑定的交换机。

想一下,是不是:生产者发送消息到DirectExchange交换机,交换机根据routingkey转发消息到绑定的Queue,供消费者消费。

Topic 交换机

举个现实生活中的栗子:

假如你想在淘宝上买一双运动鞋,那么你是不是会在搜索框中搜“XXX运动鞋”,这个时候系统将会模糊匹配的所有符合要求的运动鞋,然后展示给你。

所谓“主题路由匹配交换机”也是这样一个道理,但是使用时也有一定的规则。

比如:

  • *表示只匹配一个词

  • #表示匹配多个词

消费端:

生产端:

#运行效果:可以看到以testTopic.开头的所有routingkey都匹配成功了,有四条数据。

把代码中#改成*运行效果:可以看到以testTopic.开头的routingkey只匹配了一个词,有两条数据。

总结:

#号与 *号就好像我们sql里面的%与_ ,表示匹配多个和只能匹配一个。

注意:

如果你路由匹配了#又不想匹配#,换成了匹配*,请记得去解绑。 如下:查看管控台你会发现他绑定了两个。

如果你换绑了,请记得解绑,不然出来的数据是既符合#,又符合*,就像并集一样。

Fanout 交换机

“无路由交换机”,说白了就是,使用这个交换机不需要routingkey绑定,和路由没有关系,它是直接绑定到队列的。

消费端:

生产端:

我们只在消费端绑定了Queue,运行结果证明在fanout交换机下,不使用路由并不影响我们生产者投递信息,消费者订阅信息。

再看一下我们的管控台:生成了交换机

我们Bindings中并没有Routingkey

这个也充分说明了fanout交换机是“无路由交换机”。

总结:

fanout交换机不需要routingkey绑定,和路由没有关系,它是直接绑定到队列的。 fanout交换机直接绑定了队列,没有经过routingkey进行匹配之类的,相对来说是所有交换机中最快的。

Last updated

Was this helpful?