rabbitmq(上)(基本结构和高可用)

rabbitmq由Erlang语言编写,实现了AMQP协议,是一款易用性、扩展性、高可用的分布式mq。
一、基本结构 rabbitmq(上)(基本结构和高可用)
文章图片

这张图揭示了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
  • message
    • routing-key:
      消息传递时路由。某些exchange类型,,以此传递到特定的queue中。
      如果binding-key是一辆公交车,会按特定路线行驶;那么routing-key就是票根,这张票对应着某辆公交车,带message去往目的地
    • header:
      消息头,决定了headers这种交换机的路由方式
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为您服务。
普通集群 【rabbitmq(上)(基本结构和高可用)】rabbitmq(上)(基本结构和高可用)
文章图片

普通集群模式会将元数据拷贝,集群中的每个节点都有其它节点的元数据信息。
元数据包含以下内容:
  1. 队列元数据:队列名称、属性;
  2. 交换器元数据:交换器名称、类型和属性;
  3. 绑定元数据:交换器与队列绑定关系,如binding_key;
  4. vhost元数据:虚拟主机内部配置和属性;
元数据只提供信息,能告诉你某个队列在哪个broker节点上。
图中消费者要消费broker1上的queue1的消息,但消费者链接到了broker3上。
broker3通过元数据信息知道queue1在broker1上,将转发这次请求。
通过这种方式,消费者消费到了broker1的queue1消息。
普通集群的优势:
消息数据只保存了一份,节约磁盘空间
普通集群的劣势:
如果一个broker故障,这个broker上的queue将不能操作
镜像集群 rabbitmq(上)(基本结构和高可用)
文章图片

镜像模式的集群是在普通模式的基础上,通过policy来实现,使用镜像模式可以实现RabbitMQ的高可用方案。
以我的理解,镜像模式是在队列层面进行同步,主队列负责写,从队列作为镜像,复制从队列的信息,提供读服务。
消费者在消费消息时,无需再作转发;而且如果某个broker故障,则重新选主。
附录 P6-P7知识合辑

    推荐阅读