共计 1879 个字符,预计需要花费 5 分钟才能阅读完成。
rabbitmq 由 Erlang 语言编写,实现了 AMQP 协定,是一款易用性、扩展性、高可用的分布式 mq。
一、根本构造
这张图揭示了 rabbitmq 的根本构造,解释几个概念
- broker
rabbit 服务实例 - vhost 虚拟主机
每个 vhost 实质上就是一个 mini RabbitMQ 服务器,领有本人的队列、交换器、绑定和权限机制 channel 信道
生产者、消费者和 broker 建设连贯(connection)后,在链接上又建设的一层轻量级链接。如果把 Connection 比作一条光纤电缆的话,那么 Channel 信道就比作成光纤电缆中的其中一束光纤。一个 Connection 上能够创立任意数量的 Channel
- queue 队列
外部保护的音讯队列 - exchange 交换机
决定了消息传递到 queue 的形式 bind 绑定关系
exchange 和 queue 之间的分割,决定了音讯的传递- binding-key:
exchange 和 queue 分割的 key
- binding-key:
message
- routing-key:
消息传递时路由。某些 exchange 类型,,以此传递到特定的 queue 中。
如果 binding-key 是一辆公交车,会按特定路线行驶;那么 routing-key 就是票根,这张票对应着某辆公交车,带 message 去往目的地 - header:
音讯头,决定了 headers 这种交换机的路由形式
- routing-key:
exchange 类型
重点解释下 exchange 的几种类型
direct
exchange 和 queue 绑定时指定 binding-key。
消息传递时,通过音讯体中的 routing-key 找对应的 binding-key,发送到具体的 queue 中
如果 message 中的 routing-key 是
hello
,发送到 direct 类型的 exchange 时,会寻找 binding-key=”hello” 的绑定键。
能找到这个 binding-key 就推送数据到对应的队列;找不到就抛弃 message
default
一种非凡的 direct exchange,创立 exchange 时不指定 exchange 名称(或名称传空串)就会创立 default exchange
新创建 queue 如果没设置绑定关系,会主动绑定到 default exchange 上,且 binding-key 与新创建的队列命雷同
比方新创建 queue 名为
world
,未设置绑定关系会绑定在 default exchange 上,binding-key=”world”;此时发送一条 routing-key=”world” 的音讯,天然会路由到 queue=”world” 的队列上
fanout
播送模式,发送到 fanout exchange 的音讯,会播送到全副与其绑定的 queue 上。
fanout 模式不关怀 binding-key 和 routing-key。
topic
主题模式,与 direct 有些相似;差异在于,direct 模式是精准匹配 binding-key 和 routing-key,而topic 模式是含糊匹配
topic 模式 匹配符有两种:#
和*
图中给了具体解释(topic-exchange),此处不多着笔墨
headers
也是一种含糊匹配的形式。
不过headers 模式不再依附 routing-key 匹配,而是利用音讯中的 headers 头传到。
二、集群高可用
原来一个 broker 为您服务,当初有 N 个 broker 为您服务。
一般集群
一般集群模式会将 元数据
拷贝,集群中的每个节点都有其它节点的元数据信息。
元数据蕴含以下内容:
- 队列元数据:队列名称、属性;
- 交换器元数据:交换器名称、类型和属性;
- 绑定元数据:交换器与队列绑定关系,如 binding_key;
- vhost 元数据:虚拟主机外部配置和属性;
元数据只提供信息,能通知你某个队列在哪个 broker 节点上。
图中消费者要生产 broker1 上的 queue1 的音讯,但消费者链接到了 broker3 上。
broker3 通过元数据信息晓得 queue1 在 broker1 上,将转发
这次申请。
通过这种形式,消费者生产到了 broker1 的 queue1 音讯。
一般集群的 劣势 :
音讯数据只保留了一份,节约磁盘空间
一般集群的 劣势 :
如果一个 broker 故障,这个 broker 上的 queue 将不能操作
镜像集群
镜像模式 的集群是在一般模式的根底上,通过 policy 来实现,应用镜像模式能够实现 RabbitMQ 的高可用计划。
以我的了解,镜像模式是在队列层面进行同步,主队列负责写,从队列作为镜像,复制从队列的信息,提供读服务。
消费者在生产音讯时,无需再作转发;而且如果某个 broker 故障,则从新选主。
附录
P6-P7 常识合辑