消息队列RabbitMQ的详细介绍 - 极悦
首页 课程 师资 教程 报名

消息队列RabbitMQ的详细介绍

  • 2021-12-14 09:53:50
  • 1047次 极悦

什么是消息队列?

消息队列的实际定义是一个用于进程间通信的组件,它将控制、内容或消息传递给另一个组件。

以另一种方式说明消息队列,将其视为在您最喜欢的餐厅订购。一线工作人员会为您点单,准备您最喜欢的餐点。然后,前线工作人员向厨房请求您的食物。厨房接受订单并制作食物。在这种情况下,收到指令并执行触发事件的操作 - 执行 订单、触发请求、执行操作。

在厨房为您制作食物时,一线工作人员不会等到食物出现,他们会继续接受其他顾客的订单。厨房继续通过订单运作和处理。每个点都有自己的职责,不会等待对方完成他们正在做的事情,也不受时间的限制。

消息队列用例

现在您可能会想,“消息队列到底适合我的架构哪里”?简单快捷的答案是:

由于同时请求过多,您会遇到“超时错误”。

您需要一种解耦方式在应用程序之间或应用程序内进行通信。

您轮询数据存储过于频繁,并且您希望该数据存储可用于回答符合条件的查询

您需要在高峰时段扩大和缩小规模

换句话说,任何时候任务不是基本用户事务的一部分,和/或结果不影响用户响应,这对于消息队列来说都是一项完美的工作。

消息队列也可用于更高级的场景。例如,可以将基于 AMQP 的消息队列(如 RabbitMQ)配置为根据规则和替代流程路由和分发消息。处理系统可能会花时间处理消息。当业务和工作负载增长并且需要扩展系统的需求很明显时,添加更多的消费者来处理队列既快速又容易。

我们现在将解释消息队列可以带来好处的情况。简单地说,两个明显的例子可以作为消息队列真正闪耀的例子:

对于长时间运行的进程和后台作业

作为微服务之间的中间人

长时间运行的进程和后台作业

当请求花费大量时间时,合并消息队列是完美的方案。

想象一个每秒处理多个请求并且在任何情况下都不会丢失一个请求的 Web 服务。此外,请求是通过耗时的过程处理的,但系统不能陷入困境。一些现实生活中的例子可能包括:

图像缩放

发送大量/大量电子邮件

搜索引擎索引

文件扫描

视频编码

传递通知

PDF处理

计算

微服务之间的中间人

对于应用程序内部和应用程序之间的通信和集成,即作为微服务之间的中间人,消息队列也很有用。想象一个系统,它需要通知系统的另一部分开始处理一项任务,或者当有大量请求同时进入时,如下面的场景:

订单处理(下订单、更新订单状态、发送订单、付款等)

送餐服务(下单、准备订单、送餐)

任何需要处理多个请求的 Web 服务

图像缩放

让我们从公司需要缩放图像的用例开始。

在房地产领域,经纪人需要大量照片才能有效地推销房产并吸引买家的眼球。通过该平台,一旦经纪人添加了该财产的新图像,将其缩放到用户友好大小的任务就交给了 RabbitMQ。消息队列一直执行图像缩放任务,直到消费者抓取它、缩放它,然后以新的有效尺寸将图像发布到网站。

但是为什么要在这种情况下使用消息队列呢?仅仅是因为可能同时添加了许多图像,这可能会导致系统缩放部分出现超时错误。

Hemnet 是一个房产上市平台,在不到一年的时间内从完全内部部署的解决方案转变为一个新的基于云的解决方案。

从单体到微服务

作为增长最快的数字停车服务之一,Parkster 已将其单体架构分解为更快、解耦的微服务。与 Netflix 一样,Parkster 最初也是作为一个整体来证明其商业模式的。他们很快意识到这种类型的系统——将整个应用程序构建到一个单元中,具有一个代码库和一个系统——效率不高。

公司成立几年后,Parkster 开始将整体拆分为多个通过消息队列进行通信的小型微服务。

文件扫描

Softonic 是软件和应用程序发现门户,每月拥有超过 1 亿用户,每天下载量超过 200 万次。该门户在其提供的服务之间具有恒定的事件和命令流,而 RabbitMQ 是首选的消息队列,有助于 Softonic 以快速、有效的架构而闻名。

用户将文件上传到 Softonic 平台,在那里进行病毒扫描,并在分发给其他用户之前收集有关文件的信息。上传成功后立即通知用户。文件信息以新的二进制数据的形式存在于一个专用服务上,并向消息队列发送通知,告知其他服务有数据准备就绪。其他服务处理这些数据,这些数据是持久的,并在过程结束时添加到网站。

以Softonic平台为例,RabbitMQ的微服务架构使得Web服务器能够快速响应请求,而不是被迫在现场执行资源繁重的流程,这对用户体验来说是不利的。

PDF处理

Web 应用程序允许用户将信息上传到网站。该站点将处理此信息并生成 PDF 并将其通过电子邮件发送给用户。在本例中,处理信息、生成 PDF 和发送电子邮件将花费几秒钟,这也是使用消息队列的原因之一。

在服务器后台工作人员之间传递后台消息

FarmBot 是一种开源机器人硬件套件,能够以高效、有趣的方式与农业项目进行交互。FarmBot 采用物理传感器和执行器,需要物理花园和软件之间的通信方法。

远程过程调用或 HTTP 请求/响应模式并不总是适用于 FarmBot,在这种情况下,设备可能被迫执行长轮询活动,并不断向 API 发出任何新远程过程调用的请求。这将导致 Web 应用程序出现巨大的可扩展性问题,并导致用户的实时体验低于标准。

例如,当 FarmBot 收到紧急停止消息时,应在创建后立即收到,而不是要求系统不断检查 API。其他示例包括远程过程调用和实时数据同步。

消息队列现在是 FarmBot Web API 的一个重要组件,用于处理各种任务,包括:

在用户和设备之间传递推送通知

在服务器后台工作人员之间传递后台消息

通过一组自定义授权插件防止未经授权的使用

使用的消息队列是RabbitMQ,一个实时消息代理,所以不需要检查新消息。诸如用户单击界面上的“移动”按钮之类的消息在客户端、设备和服务器之间来回发送,不需要请求。

将消息代理视为机器对机器的聊天应用程序。任何具有正确授权的软件包,包括 REST API、FarmBot OS 或第三方固件,都可以向当前连接到消息代理的任何其他实体发送消息。

ElephantSQL(PostgreSQL 数据库托管服务)的数据库备份处理

ElephantSQL(PostgreSQL 数据库即服务)在架构中使用队列进行日常备份处理。每天有数千条“执行-数据库-备份”消息添加到队列中,每个数据库一个。然后另一个服务订阅消息并创建备份。

也可以通过客户 API 或 Web 界面按需创建备份。这个备份应该在请求发送后立即可用 - 换句话说,这是一个优先事项。为了解决这个问题,你的消息队列需要能够以某种方式对消息进行优先级排序,在这种情况下使用 RabbitMQ。“perform-database-backup”消息被添加到同一个队列中,但该消息的消息优先级高于所有其他请求。发送的消息将立即放在队列的头部。

使用消息队列扩展微服务架构

CloudAMQP(RabbitMQ 即服务)由许多提供各种功能的消息队列提供支持。如果您对此比较感兴趣,想了解更多相关知识,不妨来关注一下极悦的Java极悦在线学习,里面课程内容丰富,通俗易懂,适合没有基础的小伙伴学习,希望对大家能够有所帮助。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交