消息队列之 RabbitMQ基本流程

介绍

关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块的知识整理记录一下了。

市面上的消息队列产品有很多,比如老牌的 ActiveMQ、RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,去年底阿里巴巴捐赠给 Apache 的 RocketMQ ,连 redis 这样的 NoSQL 数据库也支持 MQ 功能。总之这块知名的产品就有十几种,就我自己的使用经验和兴趣只打算谈谈 RabbitMQ、Kafka 和 ActiveMQ ,本文先讲 RabbitMQ ,在此之前先看下消息队列的相关概念。

什么叫消息队列

消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

为何用消息队列

从上面的描述中可以看出消息队列是一种应用间的异步协作机制,那什么时候需要使用 MQ 呢?

以常见的订单系统为例,用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成相应单据、发红包、发短信通知。在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单量增长,需要提升系统服务的性能,这时可以将一些不需要立即生效的操作拆分出来异步执行,比如发放红包、发短信通知等。这种场景下就可以用 MQ ,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息到 MQ 让主流程快速完结,而由另外的单独线程拉取MQ的消息(或者由 MQ 推送消息),当发现 MQ 中有发红包或发短信之类的消息时,执行相应的业务逻辑。

以上是用于业务解耦的情况,其它常见场景包括最终一致性、广播、错峰流控等等。

RabbitMQ 特点

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。

AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括:

  1. 可靠性(Reliability)
  2. RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  3. 灵活的路由(Flexible Routing)
  4. 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
  5. 消息集群(Clustering)
  6. 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  7. 高可用(Highly Available Queues)
  8. 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  9. 多种协议(Multi-protocol)
  10. RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  11. 多语言客户端(Many Clients)
  12. RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
  13. 管理界面(Management UI)
  14. RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  15. 跟踪机制(Tracing)
  16. 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
  17. 插件机制(Plugin System)
  18. RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

RabbitMQ 中的概念模型

消息模型

所有 MQ 产品从模型抽象上来说都是一样的过程:

消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。

消息流

RabbitMQ 基本概念

上面只是最简单抽象的描述,具体到 RabbitMQ 则有更详细的概念需要解释。上面介绍过 RabbitMQ 是 AMQP 协议的一个开源实现,所以其内部实际上也是 AMQP 中的基本概念:

RabbitMQ 内部结构

  1. Message
  2. 消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
  3. Publisher
  4. 消息的生产者,也是一个向交换器发布消息的客户端应用程序。
  5. Exchange
  6. 交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
  7. Binding
  8. 绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
  9. Queue
  10. 消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  11. Connection
  12. 网络连接,比如一个TCP连接。
  13. Channel
  14. 信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
  15. Consumer
  16. 消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
  17. Virtual Host
  18. 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
  19. Broker
  20. 表示消息队列服务器实体。

AMQP 中的消息路由

AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列。

AMQP 的消息路由过程

Exchange 类型

Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型:

  1. direct

  1. direct 交换器
  2. 消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是完全匹配、单播的模式。
  3. fanout

  1. fanout 交换器
  2. 每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。
  3. topic

  1. topic 交换器
  2. topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。

最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(777)领取,祝大家更上一层楼!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31997.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现IllegalArgumentException:Could not resolve placeholder ‘xxx‘ in value “${xxxx}“ 的问题

在写一个SSM框架的整合项目时,出现了 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder data.username in value "${data.username}"错误. 在查阅了很多资料,结果是自己的一个配置xml文件导致的: 引入了一个外部文件db.properties,需要…

后台返回数据中有换行符,但是在文本中不显示换行效果

之前在标签里面是这样写的 &#xff08;vue项目&#xff09; <div class"text">{{trainDetail.trainingContent}}</div>返回的后台数据是这样的 是含有换行符的 后面发现用v-htm就可以解决 <div class"text" v-html"trainDetail.trai…

Notepad++支持显示回车符,换行符,TAB键,行首,行尾等特殊字符

Notepad默认&#xff0c;也和其他编辑器一样&#xff0c;是不显示空格和TAB键的 &#xff0c;不过我最近在用Notepad写Python脚本过程中&#xff0c;常需要显示空格键和TAB键 以避免两者混合缩进&#xff0c;所以去设置了&#xff0c;将空格键和TAB键也显示出来。 下面以某H…

chatgpt赋能python:如何在Python中让print不换行

如何在Python中让print不换行 在Python编程中&#xff0c;print语句是一个非常常见和有用的功能。然而&#xff0c;有时候我们需要在一行中连续打印多个输出&#xff0c;但是默认情况下&#xff0c;print语句会自动换行&#xff0c;这就会导致输出不太理想。在这篇文章中&…

chatgpt赋能python:怎么一行输入不换行Python

怎么一行输入不换行Python Python是一种易学易用的编程语言&#xff0c;它广泛应用于Web开发、数据分析、机器学习等领域。在Python编程中&#xff0c;经常需要将多个语句写在一行&#xff0c;但是默认情况下&#xff0c;每写完一条语句&#xff0c;Python都会自动换行。这时候…

chatgpt赋能python:如何让Python输出内容不自动换行

如何让Python输出内容不自动换行 Python作为一种高级编程语言&#xff0c;使得许多开发人员乐于使用它来编写代码。然而&#xff0c;有时Python的自动换行功能会对开发人员造成困扰。在编写Python脚本时&#xff0c;输出的内容可能会被换行符分割成多个行&#xff0c;并最终导…

chatgpt赋能python:如何让Python输出结果不换行?

如何让Python输出结果不换行&#xff1f; Python是一门高级编程语言&#xff0c;它是开发应用程序的首选语言之一。当使用Python编写应用程序时&#xff0c;我们经常需要输出一些内容到控制台。但是&#xff0c;Python默认情况下&#xff0c;每输出一行内容都会自动换行&#…

返回数据中的换行符,标签内不显示换行问题

&#xff08;接口返回数据-已返回换行符&#xff09;&#xff1a; IE返回数据&#xff1a; chorme返回数据&#xff1a; 页面显示&#xff08;不是textarea&#xff0c;是div&#xff09;&#xff08;IE Chrome&#xff09;&#xff1a; 问题&#xff1a;换行符已返回&#x…

PlotNeuralNet + ChatGPT创建专业的神经网络的可视化图形

PlotNeuralNet&#xff1a;可以创建任何神经网络的可视化图表&#xff0c;并且这个LaTeX包有Python接口&#xff0c;我们可以方便的调用。 但是他的最大问题是需要我们手动的编写网络的结构&#xff0c;这是一个很麻烦的事情&#xff0c;这时 ChatGPT 就出来了&#xff0c;它可…

chatgpt赋能python:Python密码校验-保护您的账户安全

Python密码校验-保护您的账户安全 密码是我们在线账户的第一道防线。一个强壮的密码可以保护我们的账户不被黑客攻击&#xff0c;保护个人隐私和资金安全。在这篇文章中&#xff0c;我将向您展示如何使用Python编程语言创建一个密码校验程序&#xff0c;以确保您的密码足够强壮…

零代码编程:用ChatGPT自动输入账号密码来登陆网站

现在很多网站都需要登陆账号和密码才能访问。如果要进行一些批量自动化操作&#xff0c;首先要做的就是模拟自动登陆。 以萝卜投研网站为例&#xff1a;https://robo.datayes.com/v2/fastreport/industry 打开网站后&#xff0c;默认出现这样一个登陆界面&#xff0c;要点击右…

chatgpt赋能python:Python怎么自动输入账号密码

Python怎么自动输入账号密码 在现代互联网时代&#xff0c;我们几乎每天都要登录各种不同的网站和应用程序。过多的账号和密码可能让我们感到头痛&#xff0c;尤其是如果我们不使用密码管理器。如果你经常登录页面&#xff0c;那么Python可以自动化这个过程&#xff0c;免去了…

chatgpt赋能python:Python如何利用自动化输入账号密码来提高工作效率

Python如何利用自动化输入账号密码来提高工作效率 在许多日常工作中&#xff0c;我们需要频繁地登录各种各样的账号&#xff0c;并且还需要输入密码。这可能会让一些人感到繁琐和乏味&#xff0c;严重影响了工作效率和效率。幸运的是&#xff0c;Python可以帮助我们解决这个问…

火爆CV圈的SAM是什么?

SAM是什么 前言 最近几周&#xff0c;人工智能的圈子里都在讨论SAM&#xff08;Segment Anything Model&#xff09;&#xff0c;一个号称&#xff08;零样本&#xff09;分割一切的图像分割模型。 图&#xff1a;Segment Anything Demo 2023年4月6号&#xff0c;Meta AI发布…

若依(ruoyi-cloud)脚手架解读,一篇精通,包票上手~

视频教程传送门&#xff1a; 基于SpringCloud Alibaba技术栈&#xff0c;若依微服务版(RuoYi-Cloud)脚手架入门精解&#xff0c;保证上手那种~_哔哩哔哩_bilibili基于SpringCloud Alibaba技术栈&#xff0c;若依微服务版(RuoYi-Cloud)脚手架入门精解&#xff0c;保证上手那种~…

chatgpt赋能python:Python主菜单:让你的网站更加用户友好

Python主菜单&#xff1a;让你的网站更加用户友好 如果你是一个使用Python编程语言的网站开发者&#xff0c;那么你肯定需要一个主菜单来引导你的用户。一个好的主菜单可以让你的网站更加用户友好&#xff0c;方便用户快速找到需要的内容。而怎样设计一个优秀的主菜单呢&#…

PrimeVue - 全面升级!免费开源、优雅好用的 Vue3 UI 组件库,可选主题超多

新版本发布了&#xff0c;主题超好看&#xff0c;还有很多独有的组件&#xff0c;强烈推荐给大家。 关于新版本 PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的 web UI 组件库。早在2021年10月我就推荐过这个组件库&#xff0c;至今一年多的时间&#xff0c;开发迭代非常快…

安卓APP源码和设计报告——健身系统

一、设计背景 1.需求分析 对于很多人来说拥有一副好身材能让自己增添不少魅力;对于爱吃而又担心自己发胖的人来说适当的运动健身是最好的选择。移动互联网时代&#xff0c;市场上“约跑”“约健身”健身APP软件成为新时代闺蜜朋友的互动模式&#xff0c;健身热潮的来临&#xf…

求和!李姐万岁!用ChatGPT写GitBook布局锤子便签配色的WordPress主题

我早期在Github写《Chrome插件英雄榜》连载的时候&#xff0c;用的是GitBook的自动构建功能&#xff0c;也就是在Github仓库&#xff0c;按照一定的规范存储markdown格式文章和配置文件&#xff0c;GitBook就会自动构建一本书&#xff0c;供读者阅读。 GitBook阅读体验确实不错…

ChatGPT + X = 更多可能性

ChatGPT具有多种先进性特征&#xff0c;一经发布备受瞩目&#xff0c;作为一个由OpenAI训练的大型自然语言处理模型&#xff0c;可实现自然语言生成、语言翻译、自然语言理解、语言摘要等一系列功能。发布两个月后月活用户突破1亿&#xff0c;成为史上用户增长速度最快的消费级…