AMQP协议是一个高级抽象层消息协议,rabbitmq是qmqp协议的实现。它主要包括以下组件:
交换机有4种不同的交换机类型:
直连交换机:Direct exchange
扇形交换机:Fanout exchange
主题交换机:Topic exchange
首部交换机:Headers exchange
扇形交换机:广播消息。它能把接收到的消息全部发送给帮定在自己身上的队列,速度最快。
直连交换机:是一种带路由功能的交换机,一个队列会和一个交换机绑定,除些之外再绑定一个rounting_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被 这个交换机送送到指定的队列里面去。同样一个binding_key也是支持应用到多个队列中的。
适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。
直连交换机的routing_key方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的routing_key,假设每个交换机上都绑定一堆的routing_key连接到各个队列上。那么消息的管理就会异常的困难。所以rabbitmq提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会跟据这个规则将数据发送到对应的多个队列上。
主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用*.#.*....的格式,每个部分用.分开,其中:
*表示一个单词
#表示任意数量(零个或多个单词)
假设有一条消息的routing_key为fast.rabbit.white,那么带有这样binding_key的几个队列都会接收这条消息。(1.fast.. 2. ..white 3. fast.# 4. .....)
下面这个图对主题交换机的描述比较到位:
当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息。
首部交换机是忽略routing_key的一种路由方式。路由器和交换机路由规则是通过header信息来交换的,这个有点像http的headers。将一个交换机声明成首部交换机,绑定一个队列的时候,定义一个hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当hash的内容匹配上的时候,消息就会被 写入队列。
绑定交换机和队列的时候,hash结构中要求携带一个键"x-match",这个键的value可以是any或者all,这个代表消息携带的hash是需要全部匹配all,还是仅匹配一个键any就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被 限定为字符串string
message:由header和BODY组成,header是由生首者添加的各种属性的集合,包括message是否被 持久化,由哪个message queue接受,优先级是多少等。而body是真正传输的app数据。
binding联系了exchange与message queue. exchange在与多个message queue发生binding后会生成一张路由表,路由表中存储着message queue所需消息的限制条件即binding key.当exchange收到message时会解析其header得到routing key,exchange根据routing key与exchange type将message路由到message queue.binding key由consumer在binding exchange与message queue时指定,而routing key由producer发送message时指定,两者的匹配方式 由exchange type决定
connection:连接,对于rabbitmq而言,其实就是一位客户端和broker之间的tcp连接。
网名:bass 分享技术 突破难点 创新思维