默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。若发布消息时指定交换机为空(""),则该消息会给默认交换机处理。
直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的。直连交换机用来处理消息的单播路由(unicast routing)(尽管它也可以处理多播路由)。下边介绍它是如何工作的:
R
的消息被发送给直连交换机时,交换机会把它路由给绑定值同样为R
的队列。比如有个直连交换机叫e1,一个队列q1,将q1以路由键k1绑定到e1后,当有消息以k1为路由键发送到e1时,e1会把这个消息投递到q1这个队列
扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的N个队列。扇型用来交换机处理消息的广播路由(broadcast routing)。扇形交换机会忽略路由键,在进行相关操作时可指定路由键为空。
主题交换机(topic exchanges)通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(multicast routing)。topic exchanges是direct exchange的通配符模式,比如有个主题交换机叫e1,队列q1绑定到e1的路由键为*.apple,队列q2绑定到e1的路由键为*.orange,当有消息以aa.apple为路由键发送给e1时,这条消息将投递给q1,q2则收不到该消息
有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。
rabbitmq消息确认分为自动和手动确认,自动确认即消费者取走消息后mq就会删除该消息,手动确认是消费者主动调用消息确认接口后mq才删除消息,如果一个消费者在尚未发送确认回执的情况下挂掉了,那AMQP代理会将消息重新投递给另一个消费者。如果当时没有可用的消费者了,消息代理会死等下一个注册到此队列的消费者,然后再次尝试投递。
延迟消息
rabbitmq通过设置消息的存活时间(ttl)实现延迟消息,当消息超过延迟时间未被消费,将被发送给指定的交换机(死信交换机),死信交换机根据指定的路由键将消息投递到某个队列(死信队列),可借此实现订单超时处理,由于rabbitmq只监听队列中第一个消息的过期时间,当后面的消息比前面的消息先过期时,会导致后面过期的消息无法及时转到死信交换机,可借助rabbitmq延迟插件来避免这个问题,延迟插件的原理是把消息拦截在交换机,等消息到期了再投递给队列