MQ RabbitMQ入门介绍和核心原理

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语言作为底层实现:Erlang有着和原生Socket一样的延迟

  • 开源、性能优秀,稳定性保障

  • 提供可靠性消息投递模式(confirm)、返回模式( return )

  • 与SpringAMQP完美的整合、API丰富

  • 集群模式丰富,表达式配置,HA模式,镜像队列模型

  • 保证数据不丢失的前提做到高可靠性、可用性

高性能原因:

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

2.2 专业术语

  • 生产者(Producer):发送消息的应用。

  • 消费者(Consumer):接收消息的应用。

  • Server:又称Broker,接受客户端连接,实现AMQP实体服务

  • Connection:连接、应用程序与Broker的网络连接

  • Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务

  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性;Body则就是消息体内容

  • Virtual host:虚拟主机,用于进行逻辑隔离,最上层的消息路由。一个Virtual host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue

  • Exchange:交换机、接收消息。根据路由键转发消息到绑定的队列

  • Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key

  • Routing key:一个路由规则,虚拟机可用它确定如何路由一个特定消息

  • Queue:也称Message Queue,消息队列,保存消息并将它们转发给消费者

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

  • Type:交换机类型 direct、topic、fanout、headers

  • Durability:是否需要持久化 ,默认为 true 表示持久化

  • Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange

  • Internal:当前Exchange是否用于RabbitMQ内部使用,默认为False

  • Arguments:扩展参数,用于扩展AMQP协议自制定化使用Name:交换机名称

3.3.2 交换器类型

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

  • fanout 。会把所有发送到该交换器的消息路由到与该交换器绑定的消息队列中。

  • Direct。会把消息路由到bingingKey 和RoutingKey 完全匹配的队列中。

  • Topic。Topic 类型的交换器哎在 direct 匹配规则上进行了扩展,不是进行完全匹配,而是进行模糊匹配。匹配规则如下:BindingKey和RoutingKey一样都是由"."分隔的字符串;BindingKey中可以存在两种特殊字符“” 和 “#”,用于模糊匹配,其中""用于匹配一个单词,"#"用于匹配多个单词(可以是0个)。

  • Headers 。Handers 类型的交换器不是根据路由匹配规则来的,而是根据消息中的 headers 属性进行匹配的。在绑定队列和交换器时指定一组键值对,当发送的消息到交换器时,RabbitMQ会获取到该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果匹配,消息就会路由到该队列。headers类型的交换器性能很差,不实用。

3.4 消息流程

  • 生产者(producer)把消息发送给交换机。创建交换机的时候指定上面的交换机类型。

  • 交换机(exchange)接收消息并且负责对消息进行路由。根据交换机的类型,消息的多个属性会被使用,例如路由键。

  • 绑定(binding)需要从交换机到队列的这种方式来进行创建。在这个例子里,我们可以看到交换机有到两个不同队列的绑定。交换机根据消息的属性来把消息分发到不同的队列上。

  • 消息(message)消息会一直留在队列里直到被消费。

  • 消费者(consumer)处理消息。

3.5 数据存储

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

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

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

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

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

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

  • 持久化存储。在broker 重启后不会丢失。

  • 临时存储。在broker 重启后会丢失。

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

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

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

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,561评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,205评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,625评论 2 7