RabbitMQ简介

RabbitMQ是基于AMQP(Advanced Message Queuing Protocol, 高级消息队列协议, 一种二进制协议) 的消息中间件, 用于分布式系统中存储转发消息.

特点:

  • 可靠性: RabbitMQ使用一些机制来保证消息的可靠性, 如持久化, 传输确认以及发布确认等.
  • 灵活的路由: 在消息进入队列之前, 使用交换器来路由消息. RabbitMQ内置有交换器, 更复杂的可以使用多个交换器绑定在一起使用.
  • 扩展性: 多个RabbitMQ节点可以组成一个集群, 也可以根据实际业务情况动态的扩展集群中的节点
  • 高可用性: 队列可以在集群中机器上设置镜像, 使得在部分节点出现问题的情况下队列仍然可以使用
  • 支持多种协议:  除了支持原生的AMQP, 还支持STOMP, MQTT等多种消息中间件协议
  • 多语言客户端: Java, Python, PHP等
  • 易用的界面管理:  自带一个易用的用户界面, 使得用户可以监控和管理消息.
  • 插件机制: 提供许多插件, 进行扩展

核心概念:

Rabbit MQ整体上是一个生产者消费者模型, 主要负责接受, 存储和转发消息. 好比一个邮局, 你将包裹(消息)送到邮局, 暂存在邮局, 邮递员将包裹以邮件的形式送到收件人手上, 邮局, 邮递员, 组成的一个系统就好比RabbitMQ.

RabbitMQ整体模型架构图

 

 1.1 生产者和消费者

Producer: 生产者, 生产消息的一方

Consumer: 消费者, 消费消息的一方

消息一般由2部分组成: 消息头, 消息体. 消息体是不透明的,不可见的, 消息头由一些列可选属性组成, 这些属性包括routing-key(路由键), priority(相对于其他消息的优先权), delivery-mode(是否需要持久性存储). 生产者把消息给Rabbit MQ后, RabbitMQ会把消息转发给感兴趣的Consumer

 

1.2 Exchange(交换器)

消息不会直接传到队列中, 中间会经过Exchange交换器这一层, exchange会把消息分配到对应的消息队列中.

Exchange用来接受生产者发送的消息, 并将消息路由给队列, 如果路由不到, 就会返回给生产者或者丢弃.

Exchange有4种类型, 不同的类型对应着不同策略:

  • direct(默认)
  • fanout
  • topic
  • headers

生产者将消息发给交换器时候, 一般会指定一个RoutingKey(路由键), 用来指定这个消息的路由规则, 而这个RoutingKey需要与交换器类型和绑定键(BindindKey)联合使用才生效

 

 生产者将消息发送给交换器时, 需要一个RoutingKey, 当RoutingKey和BindingKey相匹配时, 消息会被路由到对应的队列中.

 

fanout:

fanout类型的Exchange的路由规则非常简单, 他会把所有发送到该Exchange的消息路由到所有与他绑定的Queue中, 不需要做任何判断操作, 所有fanout是最快的, 常用来广播消息

direct:

他会把消息路由到那些BindingKey与RoutingKey完全匹配的Queue中

 

 

以上图为例,如果发送消息的时候设置路由键为“warning”,那么消息会路由到 Queue1 和 Queue2。如果在发送消息的时候设置路由键为"Info”或者"debug”,消息只会路由到Queue2。如果以其他的路由键发送消息,则消息不会路由到这两个队列中。

direct 类型常用在处理有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。

topic:

direct严格的匹配模式不能满足很多情况, 所以topic是对direct的一种扩展, 与direct类似, 但是匹配规则不同

  • RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;
  • BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串;
  • BindingKey 中可以存在两种特殊字符串“*”和“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。

 

个人觉得这些类似与正则表达式, 可以满足很多匹配条件, 少量大量的都可以

headers:(不推荐)

headers类型的交换器不依赖于路由器的匹配规则来路由消息, 而是根据发送的消息内容中headers属性进行匹配.

 

 1.3 Queue(消息队列)

用来保存消息, 直接发给消费者. 一个消息可以投入多个消息队列, 多个消费者可以订阅一个队列, 这时队列会被平均分摊(Round-Robin, 轮询)给多个消费者进行处理, 避免被重复消费.

 

1.4 Broker(消息中间件的服务节点)

一个RabbitMQ可以看作一个Rabbit MQ服务节点, 大多数情况下可以看作一台RabbitMQ服务器.

 

 

参考文档: https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/data-communication/rabbitmq.md

posted @ 2020-04-19 20:04  Coding-Liu  阅读(277)  评论(0)    收藏  举报