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

rabbitmq由Erlang语言编写,实现了AMQP协议,是一款易用性、扩展性、高可用的分布式mq。

一、基本结构

rabbitmq(上):基本结构和高可用_第1张图片

这张图揭示了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(上):基本结构和高可用_第2张图片

普通集群模式会将元数据拷贝,集群中的每个节点都有其它节点的元数据信息。

元数据包含以下内容

  1. 队列元数据:队列名称、属性;
  2. 交换器元数据:交换器名称、类型和属性;
  3. 绑定元数据:交换器与队列绑定关系,如binding_key;
  4. vhost元数据:虚拟主机内部配置和属性;

元数据只提供信息,能告诉你某个队列在哪个broker节点上。

图中消费者要消费broker1上的queue1的消息,但消费者链接到了broker3上。
broker3通过元数据信息知道queue1在broker1上,将转发这次请求。
通过这种方式,消费者消费到了broker1的queue1消息。

普通集群的优势
消息数据只保存了一份,节约磁盘空间
普通集群的劣势
如果一个broker故障,这个broker上的queue将不能操作

镜像集群

rabbitmq(上):基本结构和高可用_第3张图片

镜像模式的集群是在普通模式的基础上,通过policy来实现,使用镜像模式可以实现RabbitMQ的高可用方案。

以我的理解,镜像模式是在队列层面进行同步,主队列负责写,从队列作为镜像,复制从队列的信息,提供读服务。

消费者在消费消息时,无需再作转发;而且如果某个broker故障,则重新选主。

附录

P6-P7知识合辑

你可能感兴趣的:(java后端rabbitmq)