了解开源消息代理RabbitMQ

news2024/11/17 11:57:05

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.coloradmin.cn/o/2116649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 循环分支语句-for循环

先n1,判断n是否<10,满足条件&#xff0c;n1&#xff0c;输出n&#xff0c;再次判断n是否<10&#xff0c;循环.......... <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

SQL进阶技巧:截止当前批次前的批次量与订单量 | 移动窗口问题

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 表A有如下字段,user id(用户ID),batch id(批次ID),order id(订单ID),create time(创建时间),同一个用户ID下有多个批次,同一个批次下有多个订单ID,相同批次ID的创建时间是相同的,创建时间精确到了秒。 统计,截…

如何通过ip命令修改网卡名?(ip link set en1p0f0 name eth0)

快速提取 ip link set enp1s0f0 down ip link set enp1s0f0 name eth0 ip link set enp1s0f0 up ifconfig eth0背景 ifconfig命令不支持修改网卡名字。可以使用ip link进行修改。 从Linux 4.9版本开始&#xff0c;ip link 命令支持一个 set 子命令&#xff0c;可以用来修改接…

iPhone16全系采用A18处理器,不再区别对待,市场压力所致

iPhone16即将在3天后发布&#xff0c;外媒基本确定今年的iPhone16将全系采用A18处理器&#xff0c;与此前的基本款采用上一代处理器有很大的差异&#xff0c;这对于苹果用户来说无疑是一大利好&#xff0c;也将有助于推动iPhone16的销售。 此前的iPhone14和iPhone15&#xff0c…

[Redis] Redis基本命令与数据类型+单线程模型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【springboot】使用AOP

目录 1. 添加依赖2. 创建切面类1. 创建切面类2. 切点表达式3. 增强方法 3. 开启AOP4. 创建控制类5. 测试 1. 添加依赖 <!-- AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop<…

【iOS】MVC入门

【iOS】MVC模式的学习 文章目录 【iOS】MVC模式的学习前言MVC模式概念MVC的交流模式MVC的一个简单实践Model层View层Controller层 MVC的优点与缺点总结 前言 笔者在暑假的学习中完成了一些小项目&#xff0c;这些小项目中间有时候出现了一个小bug都要寻找很久&#xff0c;而且会…

前端学习笔记-Web APls篇-05

Bom操作 1.Window对象 1.1BOM(浏览器对象模型&#xff09; BOM(Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都…

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT&#xff0c;这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频&#xff0c;并利用 SAM 2 进行 3D 空间分割&#xff0c;无需进一步训练或 2D-3D 投影。 我们的框架…

ML19_GMM高斯混合模型详解

1. 中心极限定理 中心极限定理&#xff08;Central Limit Theorem, CLT&#xff09;是概率论中的一个重要定理&#xff0c;它描述了在一定条件下&#xff0c;独立同分布的随机变量序列的标准化和的分布趋向于正态分布的性质。这个定理在统计学中有着广泛的应用&#xff0c;尤其…

算法篇_C语言实现霍夫曼编码算法

一、前言 霍夫曼编码&#xff08;Huffman Coding&#xff09;是一种广泛使用的数据压缩算法&#xff0c;特别适用于无损数据压缩。它是由David A. Huffman在1952年提出的&#xff0c;并且通常用于文件压缩和传输中减少数据量。霍夫曼编码的核心思想是使用变长编码表对源数据进…

提升效率必备!学习awk命令,轻松搞定数据

在日常的工作中&#xff0c;无论是数据处理、日志分析&#xff0c;还是格式化输出&#xff0c;AWK命令都是不可或缺的利器。AWK是一种强大的文本处理工具&#xff0c;能让你轻松处理复杂的数据&#xff0c;提升工作效率。本文将为你介绍AWK的基本功能及一些实用场景&#xff0c…

树 --- 二叉树

树的物理结构和逻辑结构上都是树形结构。 树形结构&#xff1a;由一个根和若干个子节点组成的集合。 最外围的为叶子节点&#xff1a;只有前驱而没有后继。 &#xff08;一&#xff09;树的性质 • ⼦树是不相交的 • 除了根结点外&#xff0c;每个结点有且仅有⼀个⽗结点 •…

每天五分钟玩转深度学习框架PyTorch:将nn的神经网络层连接起来

本文重点 前面我们学习pytorch中已经封装好的神经网络层,有全连接层,激活层,卷积层等等,我们可以直接使用。 如代码所示我们直接使用了两个nn.Linear(),这两个linear之间并没有组合在一起,所以forward的之后,分别调用了,在实际使用中我们常常将几个神经层组合在一起…

【EI会议征稿通知】第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)

第十一届机械工程、材料和自动化技术国际会议&#xff08;MMEAT 2025&#xff09; 2025 11th International Conference on Mechanical Engineering, Materials and Automation Technology 本次大会旨在汇聚全球机械工程、材料科学及自动化技术的创新学者和行业专家&#xff0…

使用 BentoML快速实现Llama-3推理服务

介绍 近年来&#xff0c;开源大模型如雨后春笋般涌现&#xff0c;为自然语言处理领域带来了革命性的变化。从文本生成到代码编写&#xff0c;从机器翻译到问答系统&#xff0c;开源大模型展现出惊人的能力&#xff0c;吸引了越来越多的开发者和企业投身其中。 然而&#xff0…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

文章目录 SCL(supervised contrastive learning)1. 监督对比学习&#xff08;SCL&#xff09;的基本概念2. SCL的损失函数3. 长尾数据集的问题4. k-正样本对比学习&#xff08;KCL&#xff09;的引入5. 总结 SBCL举例说明&#xff1a;狗的分类 关键点&#xff1a;划分为多个子类…

4-1.Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类&#xff0c;它提供摄像头的各种详细信息&#xff0c;例如&#xff0c;摄像头的方向、是否支持闪光灯等&#xff0c;以下是它的常用属性 static int CAMERA_FACING_BACK&#xff1a;表示设备的后置…

Protobuf库的使用

文章目录 Protobuf是什么Protobuf使⽤流程介绍ProtoBuf的使用创建.proto⽂件指定proto3语法package声明符定义消息&#xff08;message&#xff09;编译contacts.proto⽂件命令如下&#xff1a;序列化与反序列化的使⽤ Protobuf是什么 ProtoBuf&#xff08;全称ProtocolBuffer…

数字 FPV 革命 – DJI、Leadcore 和 Artosyn 的三角关系。

人们对 DJI、Caddx FPV 以及 HDZero 等公司最近推出的数字 FPV 系统的起源进行了大量的猜测和推测。随着 Avatar 系统的发布&#xff0c;也有许多人认为它要么使用与 DJI 相同的芯片组&#xff0c;要么是复制品或克隆品。在本文中&#xff0c;我将尝试揭开这一切的神秘面纱&…