前言

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP,即Advanced Message Queuing
Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。一键获取RabbitMQ面试题


AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

先了解一下AMQP协议中间的几个重要概念:

  • Server:接收客户端的连接,实现AMQP实体服务。
  • Connection:连接,应用程序与Server的网络连接,TCP连接。
  • Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
  • Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
  • Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种
  • Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
  • RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
  • Queue:消息队列,用来保存消息,供消费者消费。

我们完全可以直接使用 Connection 就能完成信道的工作,为什么还要引入信道呢?

信道主要是为了解决 一个应用程序中有很多个线程需要从 RabbitMQ 中消费消息,或者生产消息,那么必然需要建立很多个 Connection,也就是许多个 TCP 连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。 RabbitMQ 采用 TCP 连接复用的方式,不仅可以减少性能开销,同时也便于管理 。

AMQP的协议模型:

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。

生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。

接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。

最后还要关闭信道和连接。

RabbitMQ是基于AMQP协议实现的,其结构如下图所示,和AMQP协议简直就是一模一样。

常用交换器

RabbitMQ常用的交换器类型有direct、topic、fanout、headers四种。

Direct

direct 的规则比较简单。在发布消息前,需要把exchange和queue做一个绑定。 如果发布消息的时候,RoutingKey 和绑定的值(key)一致。则将消息投递到该队列中。如果不存在对应的队列,则消息会被丢弃。

fanout

只要exchange和队列做了绑定。发布的消息都会到队列中去。每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上。
topic

和direct类型相比。topic相当于模糊匹配,而direct为全等。类似mysql中 ‘like’关键词。

应用场景

  • 异步处理。提升系统服务的性能,这时可以将一些不需要立即生效的操作拆分出来异步执行。例如订单系统发送短信通知等,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息到
    MQ 让主流程快速完结,而由另外的单独线程拉取MQ的消息(或者由 MQ 推送消息),当发现 MQ
    中有发短信之类的消息时,执行相应的业务逻辑

  • 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。

  • 日志处理

  • 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。

一文读懂RabbitMQ 消息队列相关推荐

  1. 5G消息能取代IM?一文读懂5G消息的前世今生!

    本文引用了公众号"鲜枣课堂"的<5G消息(RCS),到底是什么?>和公众号"InfoQ"的<5G消息来了,它会干掉微信还是变成另一个飞信?&g ...

  2. 一文读懂:Kafka(分布式消息队列)的基础概念,教程

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  3. RabbitMQ 一文读懂

    目录 1.RabbitMQ 介绍 应用场景 其他消息队列 选择RabbitMQ 原因 2.AMQP消息队列其他相关知识 什么是AMQP? 什么是JMS? 3.RabbitMQ 快速入门 RabbitM ...

  4. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

    1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...

  5. 即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?

    本文引用了"蔷薇Nina"的"Nginx 相关介绍(Nginx是什么?能干嘛?)"一文部分内容,感谢作者的无私分享. 1.引言 Nginx(及其衍生产品)是目前 ...

  6. 一文读懂大数据平台——写给大数据开发初学者的话!

     一文读懂大数据平台--写给大数据开发初学者的话! 文|miao君 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hado ...

  7. 一文读懂5G R16标准究竟讲了些什么

    7月3日,3GPP宣布完成5G标准第二版规范R16. 那R16究竟讲了些什么? 考虑向垂直行业扩展是R16的重头戏,本文将R16主要功能分为"向垂直行业扩展"和"功能增强 ...

  8. 一文读懂物联网 MQTT 协议之实战篇

    一.前言 上一篇我们介绍了 MQTT 协议格式以及相关的特性:一文读懂物联网 MQTT 协议之基础特性篇,这一篇我们就来实战一番,理论得与实践结合,方能吃透 MQTT. 我的那个读者还提到了讲一下 M ...

  9. 一文读懂智能网联封闭测试场的现状和挑战

    文章版权所有,未经授权请勿转载或使用 智能网联封闭测试场应具备全覆盖.低延时的路侧通信设备,支持LTE-V2X.5G.Wi-Fi等协议.可进行三个级别测试:L1和L2级自动驾驶的ADAS系统测试:L3 ...

最新文章

  1. WordPress在Permalink取消index.php后nginx404的解决方案
  2. mysql table combine_Mysql系列-性能优化神器EXPLAIN使用介绍及分析
  3. TPFanControl v0.62 + 汉化补丁
  4. 计算机科学课程体系核心内容,计算机科学教育的课程体系之研究
  5. .NET Core + Spring Cloud:API 网关
  6. linux Nas挂载
  7. 高德地图看各省分界线_深度解读|高德宣布高精地图“百元时代”背后的商业逻辑是什么...
  8. oracle脚本审核平台,Oracle 脚本(适应各种业务需要)
  9. NGUI的输入框的校验(input filed script)
  10. python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
  11. 华为ensp的缺省_华为模拟器 eNSP安装教程
  12. 电商促销类插画素材,适合各种活动banner设计
  13. linux程序改ip地址吗,如何在Linux中从C设置IP地址
  14. nginx基于端口的虚拟主机配置实战
  15. 5道经典基础编程题让你入门C语言
  16. Springboot框架简介
  17. 9月编程排行榜新鲜出炉霸榜还得是它~
  18. 身份证号码验证C语言函数
  19. Java研发小试(面试题)
  20. AD怎么输入坐标_双心软件回头曲线坐标计算?

热门文章

  1. docker1.12在cento7里的组建swarm (一)
  2. 射频芯片layout实战注意
  3. Redis命令详解:Streams
  4. 社群运营助手,微信管理工具
  5. 2022-4-2 Leetcode 25.K个一组翻转
  6. 会声会影2022最高版中文原程序新试用版
  7. DevExpress换肤
  8. linux相对路径查看文件是否存在,2 linux笔记 文件目录管理
  9. 时间GMT UTC 夏令时
  10. b站《史上最全unity3D教程》组件,属性 等ppt笔记2