前言
上文已经提过,发布者将消息推送到交换机,由交换机通过一定规则去匹配绑定在此台交换机上的队列,并将消息推送到匹配成功的队列中。也就是说,发布者(producer)不会直接发送任何消息给队列,甚至不知道消息是否已经被投递到队列,那么接下来我们将一起看一下有关交换机的相关内容。
主要属性
- name:交换机名称
- type:交换机类型,包括direct、topic、fanout、headers四种
- Durability:是否需要持久化
注意:将消息设为持久化并不能完全保证不会丢失。以上代码只是告诉了RabbitMq要把消息存到硬盘,但从RabbitMQ收到消息到保存之间还是有一个很小的间隔时间。因为RabbitMq并不是所有的消息都使用fsync(2)——它有可能只是保存到缓存中,并不一定会写到硬盘中。并不能保证真正的持久化,但已经足够应付我们的简单工作队列。如果你一定要保证持久化,你需要改写你的代码来支持事务(transaction)。
- autodelete:当此交换机上所有绑定的队列都不再使用时,是否自动删除该交换机
- internal:当前exchange是否用于RabbitMQ内部使用,默认为false,若开启这个属性,则Producer向其发送消息会抛出异常
- arguments:扩展参数,用于扩展AMQP协议自定制化使用
扇形交换机(Fanout Exchange)
扇形交换机在接收到发布者(Producer)发送的消息后,会将消息广播到所有绑定在此台交换机上的队列(Queue1、Queue2),并且不需要考虑routing key。也正是由于采用广播这种不需要“思考”的推送方式,所以扇形交换机处理消息的性能也是几种交换机中最高的。
直连交换机(Direct Exchange)
当直连交换机接收到Producer推送的消息后,会通过Routing key与绑定在此交换机上的队列进行比对,若Routing key1与Binding key1相等,则会将消息推送到Queue1中。还有一点就是同一个Binding key可以绑定多个队列,也就是多重绑定(multiple bindings),此时交换机的行为有点类似扇形交换机,如下图Bingding key1同时绑定了Queue1、Queue3,则交换机会将消息推送到Queue1、Queue3。
主题交换机(Topic Exchange)
与直连交换机的完全匹配不同,主题交换机对于Routing key与Binding key的匹配更加灵活,具体规则如下:
- key必须由英文单词列表组成,单词之间使用”.”分隔
- key的最大长度不得超过255个字符
- *可以匹配一个单词
- #可以匹配零或多个单词
如下图,当传入routing key为Test.yyyy时,交换机将会推送消息到Queue1,、Queue2中;传入routing key为Test.yyyy.mm.dd时,交换机则会将消息推送到Queue1中。
头交换机(Headers Exchange)
头交换机的行为有些类似直连交换机(Direct Exchange),不同的是直连交换机通过routing key进行匹配,而此交换机通过Headers进行匹配,并且支持number、boolean、list类型。
代码地址:https://github.com/a40885948/rabbitmq-learn