MQ RabbitMQ入门介绍和核心原理

2021-04-15  本文已影响0人  小P聊技术

1 简介

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 且RabbitMQ是基于 AMQP 协议的,目前各个互联网大厂都在使用RabbitMQ作为消息中间件。

附上官网地址: https://www.rabbitmq.com/

2 特点

2.1 核心特点

高性能原因:

  • Erlang语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能非常优秀
  • Erlang有着和原生Socket一样的延迟

2.2 专业术语

3 核心功能

3.1 AMQP

基础模型

v2-370a909a995cde466c4965b51b6782dd_720w.jpg

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

它可以使对应的客户端(client)与对应的消息中间件(broker)进行交互。消息中间件从发布者(publisher)那里收到消息(发布消息的应用,也称为producer),然后将他们转发给消费者(consumers,处理消息的应用)。由于AMQP是一个网络协议,所以发布者、消费者以及消息中间件可以部署到不同的物理机器上面。

虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。

3.2 基础架构

780135-20210209091458529-1809465892.png

3.3 交换器

3.3.1 交换机属性

Exchange

3.3.2 交换器类型

生产者发送消息到 RabbitMQ 的交换器上。常用的交换器有四种:

3.4 消息流程

3.5 数据存储

RabbitMQ消息有持久化消息和非持久化消息。

持久化消息在到达队列时写入磁盘,同时在内存中保存一份备份,当内存不足时,消息从内存中清除。

非持久化消息一般只存在内存中,当内存不足时进行数据的刷盘处理。节省内存空间。

RabbitMQ 存储层包含两部分,队列索引和消息存储。索引维护队列的落盘消息的信息,比如存储地点、是否已经被消费者接收,是否已经被消费者ack等,每个队列都有相应的索引。

索引使用顺序的段文件来存储,后缀为 .idx ,文件名从0开始累加,每个段文件中包含固定的记录数,默认是16384 ,每个index从磁盘中读取消息的时候,都会在内中中维护一段文件。

消息存储。消息通过键值对的形式存储到文件中,一个虚拟主机上的所有队列使用同一块存储,每个接地那只有一个。存储分为:

存储方式为文件来存储,后缀为 .rdq 。经过store 处理的所有消息都会以追加的方式写入到该文件中,当文件达到指定容量时,会创建一个新的文件进行写入。

读取消息时,先根据消息的ID(msg_id)找到对应存储的文件,如果文件存在并且未被锁住,则直接打开文件,从指定位置读取消息内容。如果文件不存在或者被锁住了,则发送请求由store进行处理。

删除消息时,只是从ETS表删除指定消息的相关信息,同时更新消息对应的存储文件和相关信息。在执行消息删除操作时,并不立即对文件中的消息进行删除,也就是说消息依然在文件中,仅仅是标记为垃圾数据而已。当一个文件中都是垃圾数据时可以将这个文件删除。当检测到前后两个文件中的有效数据可以合并成一个文件,并且所有的垃圾数据的大小和所有文件(至少有3个文件存在的情况下)的数据大小的比值超过设置的阈值garbage_fraction(默认值0.5)时,才会触发垃圾回收,将这两个文件合并,执行合并的两个文件一定是逻辑上相邻的两个文件。

4 相关信息

上一篇 下一篇

猜你喜欢

热点阅读