了解开源消息代理RabbitMQ

news/2024/12/30 22:50:09/

1.RabbitMQ 是什么?

        RabbitMQ是一个消息代理:它接受并转发消息。你可以把它想象成邮局:当你把要寄的邮件放进邮箱时,你可以确定邮递员最终会把邮件送到收件人那里。在这个比喻中,RabbitMQ是一个邮筒、一个邮局和一个邮递员。RabbitMQ和邮局之间的主要区别在于,它不处理纸张,而是接受、存储和转发二进制数据消息。

        RabbitMQ和一般的消息传递使用了一些术语。

        生产只不过意味着发送。发送消息的程序是生产者:P。

        队列是RabbitMQ中邮箱的名称。虽然消息流经RabbitMQ和你的应用程序,但它们只能存储在队列中。队列只受主机的内存和磁盘限制,它本质上是一个大的消息缓冲区。许多生产者可以向一个队列发送消息,而许多消费者可以尝试从一个队列接收数据。队列的表示方式如下:

         消费和接受有着相似的含义。consumer是一个主要等待接收消息的程序:C。

        总结:

  • 生产者是发送消息的用户应用程序。
  • 队列是存储消息的缓冲区。
  • 使用者是接收消息的用户应用程序。 

         注意,生产者、消费者和代理不必驻留在同一主机上;事实上,在大多数应用程序中,它们不需要。应用程序既可以是生产者,也可以是消费者。

2.工作队列

         工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成。相反,我们把任务安排在以后完成。我们将任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行多个worker时,任务将在它们之间共享。这个概念在web应用程序中特别有用,因为在短的HTTP请求窗口中不可能处理复杂的任务。

 3.发布订阅

        为了说明这个模式,我们将构建一个简单的日志系统。它将由两个程序组成——第一个程序将发出日志消息,第二个程序将接收并打印它们。 

        在我们的日志系统中,接收程序的每个运行副本都会得到消息。这样我们就可以运行一个接收器并将日志引导到磁盘;与此同时,我们将能够运行另一个接收器并在屏幕上看到日志。 从本质上讲,发布的日志消息将被广播到所有的接收者。

        RabbitMQ消息模型的核心思想是生产者永远不会直接向队列发送任何消息。实际上,通常生产者甚至不知道消息是否将被传递到任何队列。 相反,生产者只能向交换器发送消息。交换是一件非常简单的事情。它一边接收来自生产者的消息,另一边将它们推送到队列中。交换器必须确切地知道如何处理它收到的消息。是否应该将它附加到特定的队列中?是否应该将它附加到许多队列中?或者它应该被丢弃。该规则由交换类型定义。

        有几种可用的交换类型:direct、topic、headers和fanout。我们来关注最后一个,扇形。让我们创建一个这种类型的exchange,并将其命名为logs:

 channel.exchangeDeclare("logs", "fanout");

        扇出交换非常简单。顾名思义,它只是将接收到的所有消息广播给它所知道的所有队列。

4.路由 

        在本教程中,我们将为其添加一个特性—我们将使仅订阅消息的子集成为可能。例如,我们将能够只将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。

 

5.主题Topics

        虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。在我们的日志系统中,我们可能不仅希望订阅基于严重性的日志,还希望订阅基于发出日志的源的日志。您可能从syslog unix工具中了解到这个概念,它根据严重性(info/warn/crit…)和设施(auth/cron/kern…)路由日志。这将给我们很大的灵活性——我们可能只想听来自'cron'的严重错误,但也想听来自'kern'的所有日志。在我们的日志系统中实现

        在之前的教程中,我们改进了日志系统。我们没有使用只能进行虚拟广播的fanout交换,而是使用了直接交换,从而获得了选择性接收日志的可能性。虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。在我们的日志系统中,我们可能不仅希望订阅基于严重性的日志,还希望订阅基于发出日志的源的日志。您可能从syslog unix工具中了解到这个概念,它根据严重程度(info/warn/crit…)路由日志。

 6.RPC

         我们学习了如何使用工作队列在多个工作者之间分配耗时的任务。但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?那是另一回事了。这种模式通常称为远程过程调用或RPC。
        我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务器。由于我们没有任何值得分发的耗时任务,因此我们将创建一个返回斐波那契数的虚拟RPC服务。

        我们的RPC将这样工作:

  • 对于RPC请求,客户端发送具有两个属性的消息:replyTo,它被设置为仅为请求创建的匿名独占队列,以及correlationId,它被设置为每个请求的唯一值。
  • 请求被发送到rpc_queue队列。
  • RPC工作器(又名:服务器)正在该队列上等待请求。当出现请求时,它完成任务,并使用replyTo字段中的队列将带有结果的消息发送回客户机。
  • 客户端等待应答队列上的数据。当出现消息时,它会检查correlationId

        RabbitMQ 是部署最广泛的开源消息代理.,RabbitMQ 拥有数以万计的用户,是最受欢迎的开源消息代理之一。从T-Mobile 到Runtastic,RabbitMQ 在全球范围内用于小型初创公司和大型企业.。RabbitMQ 是轻量级的,易于在本地和云端部署。它支持多种消息传递协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模、高可用性的要求.

 

 

 


http://www.ppmy.cn/news/1524467.html

相关文章

《Spring实战》读书笔记-第5章 构建Spring Web应用程序

5.1 Spring MVC起步 Spring MVC框架主要包括请求调度Servlet、处理器映射(handler mapping)、控制器以及视图解析器(view resolver)这些组件。 跟踪Spring MVC的请求 Web请求从离开浏览器开始到获取响应返回,它会经历…

html+css+js网页设计 旅游 龙门石窟8个页面

htmlcssjs网页设计 旅游 龙门石窟8个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…

无刷直流电动机及其控制

目录 无刷直流电动机的基本方程 无刷直流电动机的控制方法 控制器方案设计 TMS320F2812最小系统设计: 控制器软件设计 系统应用软件总体结构 控制器系统控制策略 基本结构 无刷直流电动机的基本方程 为简化分析,以一台三相两极永磁电动机为例&…

《Java并发编程的艺术》读后笔记-part2

1.volatile的应用 在多线程并发编程中synchronized和volatile都扮演着重要角色。与synchronized不同的是,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。 可见性:当一个线程修改一个共享变量时&#xff0c…

如何根据企业的实际需求设计 cmdb系统

以下是根据企业实际需求设计配置管理数据库(CMDB)系统的步骤: 一、明确需求和目标 业务需求分析 与企业各部门沟通,了解他们对 IT 资源信息的需求。例如,运维团队可能需要准确的服务器配置信息以快速解决故障&#xff…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7106 标注数量(xml文件个数):7106 标注数量(txt文件个数):7106 标注…

ArcGIS Pro SDK (十三)地图创作 5 图层样式

ArcGIS Pro SDK (十三)地图创作 5 图层样式 文章目录 ArcGIS Pro SDK (十三)地图创作 5 图层样式1 风格管理1.1 如何按名称获取项目中的样式1.2 如何创建新样式1.3 如何向项目添加样式1.4 如何从项目中删除样式1.5 如何将样式项添加到样式1.6 如何从样式中删除样式项1.7 如…

【软件合集】电脑桌面整理工具、DLL修复工具、文件加密等11款电脑必备软件,高效办公!

经常使用电脑办公的用户一定知道,第三方软件对于提高办公效率的影响力有多高! 除了电脑自带的功能之外,市面上还有很多好用的电脑软件,一款好用的电脑软件可以提高我们的办公效率,节省时间。 本期内容,小编…