一、前言
RabbitMQ的Exchange,即交换机,是用来发送消息的AMQQP实体,通常交换机拿到一个消息之后,根据路由规则,路由到一个或零个队列;
二、Exchange的类型
AMQP 0-9-1 的代理提供了四种交换机:
除交换机类型外,在声明交换机时还可以附带许多其它数据,其中比较常用的是:
- Name:交换机的名称
- Durable:是否持久化(重启rabbitmq之后,交换机是否还存在)
- AutoDelete:是否自动删除(当交换机把消息发送到与之绑定的消息队列后,是否删除交换机)
Direct Exchange
直连型交换机,是根据消息携带的路由键(routing key)将消息传递给对应绑定路由键的队列,它是如何工作的?
1)先声明一个队列和交换机,将一个队列绑定到交换机上,赋予该传输的路由规则(路由键),假设为R;
2)当一个携带路由键为R的消息被发送到直连型交换机时,交换机会根据携带的R,路由到对应队列;
正常情况下,直连交换机可以与多个不同的队列进行绑定,并发送消息到各个队列中。
比如:有2个队列Queue1和Queue2绑定同个交换机,并且路由规则相同,当有消息P发送到交换机时,此时2个队列都能接受到消息;
直连型交换机工作图:
Fanout Exchange
扇形交换机,是将消息路由到绑定此交换机的所有队列,而不理会绑定的路由键。比如有2个队列Queue1和Queue2绑定到某个扇形交换机上,当有消息发送给此扇型交换机时,交换机会将消息拷贝,分别发送给绑定的队列;
扇型交换机工作图:
Topic Exchange
主题交换机,可以说是直连交换机的升级版,直连交换机的路由规则比较严格,生产者发送的Routing Key必须与队列的Binding Key完全相匹配的时候,才能将消息传递给队列,但主题交换机的路由规则是一种模糊匹配,可以通过通配符来满足一部分路由规则;它的约定是:
- routing key为一个句点号“.”分隔的字符串(我们将句点号“.”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”;
- binding key与routing key一样也是句点号“.”分隔的字符串;
- binding key中可以存在两种特殊字符“ * ”与“ # ”,用于做模糊匹配,其中“ * ”用于匹配一个单词,“ # ”用于匹配多个单词(可以是零个);
主题交换机工作图:
Headers Exchange
头交换机,不依赖于routing key与binding key的匹配规则来路由消息到队列中,而是根据发送的消息内容中的headers属性进行匹配;
- 在绑定Queue和Exchange时指定一组键值对,当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue和Exchange绑定时指定的键值对,匹配则将消息路由到该Queue,反之则不发送消息到该Queue;
此类型的Exchange没有用过,因此不做介绍;