《RabbitMQ实战指南》整理(一)RabbitMQ简介及入门

一、什么是消息中间件

消息队列中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它一般有两种传递模式:点对点模式和发布/订阅模式。

消息中间件能够在不同平台之间进行通信,它常用来屏蔽各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发。

二、消息中间件的作用

  • 解耦:消息中间件在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,这允许你独立地扩展或修改两边的处理过程,只要确保它们遵循相同的接口约束。
  • 冗余:在某些情况下处理数据的过程会失败,消息中间件可以把数据进行持久化直到它们已经完全被处理,以达到规避数据丢失风险的目的。
  • 扩展性:因为消息中间件解耦了应用程序的处理过程,所以提高消息入队和处理的效率是很容易的,只需要另外增加处理过程即可。
  • 削峰:使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃。
  • 可恢复性:一个处理消息的进程挂掉,不会影响到整个系统,系统恢复后仍可以处理。
  • 顺序保证:大多数消息中间件支持一定程度上的顺序性。
  • 缓冲:消息中间件通过一个缓冲层来帮助任务最高效的执行,写入消息中间件的处理会尽可能快速。
  • 异步通信:消息中间件提供了异步处理机制,允许把消息放入中间件中不立即处理,而是在之后需要的时候再慢慢处理。

三、相关概念介绍

1、生产者和消费者

  • Producer:生产者,投递消息的一方;生产者创建消息并发布到RabbitMQ中,消息一般分为消息体和标签,标签Label用来表述这条消息,消息体Payload一般是一个带有业务逻辑结构的数据如Json字符串
  • Consumer:消费者,接受消息的一方;消费者消费一条消息时,指挥消费消息的消息体,再消息路由的过程中,消息的标签会被丢弃
  • Broker:消息中间件的服务节点;一个RabbitMQ Broker可以简单看作是一个RabbitMQ服务节点,或者RabbitMQ实例;生产者对业务数据包装后封装成消息,发送到Broker中,消费者经过解包处理得到原始的数据,再进行业务逻辑处理

2、队列

Queue:队列是RabbitMQ的内部对象,用于存储消息;RabbitMQ的消息只能存储在队列中;多个消费者可以订阅同一个队列,队列中的消息会被平均分摊,给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理;RabbiteMQ不支持队列层面的广播消费,也不建议这么做

3、交换器、路由器、绑定

  • Exchange:交换器;在实际情况中,生产者将消息发送到Exchange,由交换器将消息路由到一个或多个队列中;RabbitMQ的交换器由四种类型,不同的类型有不同的路由策略
  • RoutingKey:路由键;生产者将消息发送给交换器时,会指定一个RoutingKey,用来指定这个消息的路由规则,这个路由键与交换器类型和绑定键联合使用才会生效;在交换器类型和绑定键固定的情况下,生产者可以在发送消给交换器时,通过指定RoutingKey来决定消息流向哪里
  • Binding:绑定;RabbitMQ中通过绑定将交换器和队列联合起来,在绑定的时候一般会指定一个BingdingKey,这样RabbitMQ就会知道如何正确地将消息路由到队列中;生产者将消息发送给交换器时需要一个RoutingKey,当BingdingKey和RoutingKey相匹配时,消息会被路由到对应的队列中,在绑定多个队列到同一个交换器时,这些绑定允许使用相同的BIngdingKey

以邮寄信件为例,交换器相当于投递的邮箱,RoutingKey相当于填写在包裹上的地址,BingdingKey相当于包裹的目的地,为了避免混淆,可以这么理解:在使用绑定时,其中需要的路由键是BindingKey;在发送消息的时候,其中需要的路由键是RoutingKey

4、交换器的类型

RabbitMQ常用的交换器类型有fanout、direct、topic和headers四种,AMQP协议中还有System和自定义,这里不予讨论

  • fanout:将所有发送到该交换器的消息路由带所有与该交换器绑定的队列中;
  • direct:把消息路由到BindingKey和RoutingKey完全匹配的队列中;
  • topic:同样是将消息路由到BindingKey和RoutingKey相匹配的队列中,但匹配规则有所不同:①RoutingKey为一个点号分隔的字符串;②BindingKey和RoutingKey同样也是一个点号分隔的字符串;BingdingKey中可以存在两种特殊字符*和#用于模糊匹配,星号用于匹配一个单词,井号用于匹配多规格单词
  • headers:不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配,该交换器性能较差,一般很少使用

5、RabbitMQ运转流程

生产者发送消息:

  1. 生产者连接到RabbitMQ Broker,建立一个连接,开启一个信道;
  2. 生产者声明一个交换器,并且设置相关属性,如交换器类型,是否持久化等;
  3. 生产者声明一个队列并设置相关的属性,如是否排他,是否持久化,是否自动删除等;
  4. 生产者通过路由键将交换器和队列绑定起来;
  5. 生产者发送消息至RabbitMQ Broker,其中包括路由键和交换器等消息;
  6. 相应的交换器根据接受到的路由键查找相匹配的队列,找到后会将消息存入队列,否则根据配置选择丢弃或退回;
  7. 关闭信道;
  8. 关闭连接;

消费者接受消息:

  1. 消费者连接到RabbitMQ Broker,建立一个连接,开启一个信道;
  2. 消费者向RabbitMQ Broker请求消费相应队列中的消息,可以设置相应的回调函数及做部分准备工作;
  3. 等待RabbitMQ Broker回应并投递相应队列中的消息,消费者接受消息;
  4. 消费者确认(ACK)接受到的消息;
  5. RabbitMQ从队列中删除相应已经被确认的消息;
  6. 关闭信道;
  7. 关闭连接;

生产者和消费者都需要与RabbitMQ Broker建立连接,这个连接就是一条TCP连接,也就是Connection,一旦TCP连接建立起来,客户端可以创建一个信道(Channel),每个信道都会被指派一个唯一的ID,信道是建立在Connection之上的连接。对于操作系统而言,建立和销毁TCP连接是非常昂贵的开销,因此RabbitMQ使用类似Non0blocking I/O的做法,选择TCP连接复用,不仅可以减少性能的开销,同时便于管理

四、AMQP协议介绍

RabbitMQ是AMQP协议的Erlang实现,本身包括三层:

  • Module Layer:位于协议的最高层,定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑;
  • Session Layer:位于中间层,主要负责将客户端的命令发送给服务器,再将服务器的应答返回给客户端,为客户端和服务器之间的通信信道提供可靠性同步机制和错误处理;
  • Transport Layer:位于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示等;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章