RabbitMQ编程模型

news2025/1/16 6:35:57

RabbitMQ基础概念

RabbitMQ是基于AMQP协议开发的一个MQ产品。
在这里插入图片描述

虚拟主机 virtual host

RabbitMQ出于服务器复用的想法,可以在一个RabbitMQ集群中划分出多个虚拟主机,每一个虚拟主机都有AMQP的全套基础组件,并且可以针对每个虚拟主机进行权限以及数据分配,并且不同虚拟主机之间是完全隔离的。

连接 Connection

客户端与RabbitMQ进行交互,首先就需要建立一个TPC连接,这个连接就是Connection。

信道 Channel

一旦客户端与RabbitMQ建立了连接,就会分配一个AMQP信道 Channel。每个信道都会被分配一个唯一的ID。也可以理解为是客户端与RabbitMQ实际进行数据交互的通道,我们后续的大多数的数据操作都是在信道 Channel 这个层面展开的。RabbitMQ为了减少性能开销,也会在一个Connection中建立多个Channel,这样便于客户端进行多线程连接,这些连接会复用同一个Connection的TCP通道,所以在实际业务中,对于Connection和Channel的分配也需要根据实际情况进行考量。

交换机 Exchange

RabbitMQ中进行数据路由的重要组件。消息发送到RabbitMQ中后,会首先进入一个交换机,然后由交换机负责将数据转发到不同的队列中。RabbitMQ中有多种不同类型的交换机来支持不同的路由策略。
交换机多用来与生产者打交道。生产者发送的消息通过Exchange交换机分配到各个不同的Queue队列上,而对于消息消费者来说,通常只需要关注自己感兴趣的队列就可以了。

队列 Queue

队列是实际保存数据的最小单位。队列结构天生就具有FIFO的顺序,消息最终都会被分发到不同的队列当中,然后才被消费者进行消费处理。这也是最近RabbitMQ功能变动最大的地方。最为常用的是经典队列Classic。RabbitMQ 3.8.X版本添加了Quorum队列,3.9.X又添加了Stream队列。

Classic 经典队列

这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。

Quorum 仲裁队列

仲裁队列,是RabbitMQ从3.8.0版本,引入的一个新的队列类型,整个3.8.X版本,也都是在围绕仲裁队列进行完善和优化。仲裁队列相比Classic经典队列,在分布式环境下对消息的可靠性保障更高。

Stream队列

Stream队列是RabbitMQ自3.9.0版本开始引入的一种新的数据队列类型,也是目前官方最为推荐的队列类型。这种队列类型的消息是持久化到磁盘并且具备分布式备份的,更适合于消费者多,读消息非常频繁的场景。

RabbitMQ编程模型

使用RabbitMQ提供的原生客户端API进行交互。

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>

基础编程模型
这些各种各样的消息模型其实都对应一个比较统一的基础编程模型。

1,首先创建连接,获取Channel

ConnectionFactory factory = new ConnectionFactory(); 
factory.setHost("localhost"); 
connection = factory.newConnection(); 
channel = connection.createChannel(); 

2,声明queue队列

channel.queueDeclare(String queue, boolean durable, boolean exclusive, 
boolean autoDelete, Map<String, Object> arguments); 
3,Producer根据应用场景发送消息到queue
channel.basicPublish(String exchange, String routingKey, BasicProperties 
props,message.getBytes("UTF-8")) ;

4,Consumer消费消息

定义消费者,消费消息进行处理,并向RabbitMQ进行消息确认。确认了之后就表 明这个消息已经消费完了,否则RabbitMQ还会继续让别的消费者实例来处理。
两种消费方式
1、被动消费模式,Consumer等待rabbitMQ 服务器将message推送过来再消费。

channel.basicConsume(String queue, boolean autoAck, Consumer callback);

2、另一种是主动消费模式。Comsumer主动到rabbitMQ服务器上去获取指定的
messge进行消费

GetResponse response = channel.basicGet(QUEUE_NAME, boolean autoAck);

3.Stream队列消费 在当前版本下,消费Stream队列时,需要注意三板斧的设置。
channel必须设置basicQos属性。
正确声明Stream队列。
消费时需要指定offset。

5,完成成以后关闭连接,释放资源

channel.close(); 

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

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

相关文章

面向对象(高级)-Annotation注解、单元测试的使用

注解&#xff08;Annotation&#xff09; 注解大纲 注解的使用1.Annotation的理解 - 注解&#xff08;Annotation&#xff09;是从JDK5.0开始引入&#xff0c;以注解名在代码中存在。 - Annotation可以像修饰符一样被使用&#xff0c;可用于修饰包、类、构造器、方法、成员变…

LeetCode:59. 螺旋矩阵 II

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;59. 螺旋矩阵 II 题目描述&#xff1a;给你一个正整数 n &#xff0c…

Python中类属性和类方法

1. 类的结构 1.1 术语 —— 实例 使用面相对象开发&#xff0c;第 1 步 是设计 类使用 类名() 创建对象&#xff0c;创建对象 的动作有两步&#xff1a; (1) 在内存中为对象 分配空间 (2) 调用初始化方法 __init__ 为 对象初始化对象创建后&#xff0c;内存 中就有了一个对象…

【敲敲云】零代码实战,主子表汇总统计—免费的零代码产品

近来很多朋友在使用敲敲云时&#xff0c;不清楚如何使用主子表&#xff0c;及如何在主表中统计子表数据&#xff1b;下面我们就以《订单》表及《订单明细》表来设计一下吧&#xff0c;用到的组件有“设计子表”、“公式”、“汇总”等。 《订单》表展示 总金额 订单明细中“小…

C++ Linux Web Server 面试基础篇-操作系统(三、进程通信)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

恢复调度平台mysql主从同步

修复问题 调度平台两台MySQL从节点存在Slave_SQL_Running异常&#xff0c;需要恢复。 部署步骤 一、先停止调度平台core服务与web服务&#xff0c;否则无法正常锁表 1.1停止调度平台core服务 2.1停止web服务 3.确认MySQL所有执行线程是否都已经停止 show processlist; 如…

小红书流量规则是什么,推荐机制解读

当今的互联网自媒体世界&#xff0c;说到底还是一个流量时代&#xff0c;一个流量为王的时代。不管你在小红书也好&#xff0c;还是其他自媒体平台都需要知晓平台的流量规则。今天和大家分享下小红书流量规则是什么&#xff0c;让我们一起通过流量规则分析小红书机制和算法。 一…

人工智能如何助力建筑设计自动化?

ChatGPT和DALL-E等工具使用大规模机器学习(ML)模型&#xff0c;并访问大量有标记和有意义的数据&#xff0c;以对文本和图像中的查询提供有见解的响应。但是&#xff0c;一些行业对训练ML模型的数据集的访问有限&#xff0c;这使得使用生成式AI来解决现实世界问题的好处很难获得…

书写我的人生回忆录-这应该是给父母最好的礼物

作为一个业余的软件开发爱好者&#xff0c;我又捣鼓了一个有意思的小东西 &#xff0c;使用完全免费哈 《书写我的人生回忆录》是一款软件&#xff0c;其中包含70个问题&#xff0c;涵盖了父母的个人喜好、家庭、工作、人生经历和态度等方面。通过回答这些问题&#xff0c;您的…

爬虫请求头Content-Length的计算方法

重点&#xff1a;使用node.js 环境计算&#xff0c;同时要让计算的数据通过JSON.stringify从对象变成string。 1. Blob size var str 中国 new Blob([str]).size // 6 2、Buffer.byteLength # node > var str 中国 undefined > Buffer.byteLength(str, utf8) 6 原文…

Spring开启事务流程和事务相关配置

文章目录 Spring事务Spring快速入门事务相关配置 Spring事务 Spring快速入门 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败 Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功同失败 Spring提供了一个接口PlatformTransactionMa…

Vue可视化项目搭建

安装Nodejs 全局下载Vue项目脚手架 创建项目 运行项目 项目初始化 安装Nodejs 下载地址&#xff1a;https://nodejs.org/zh-cn/ 下载完成之后一路点击下一个安装 全局下载Vue项目脚手架 进入开始菜单以管理员身份运行命令提示符 输入更换镜像源为淘宝源 npm config s…

java线程屏障CyclicBarrier

CyclicBarrier允许一组线程在达到一个公共的屏障点时相互等待。它在涉及固定大小的线程组、并且这些线程必须相互等待的程序中非常有用&#xff0c;CyclicBarrier可以在等待的线程被释放后被重用。 构造方法 CyclicBarrier(int parties) 创建一个新的屏障并设置将要访问这个…

问卷调查样本量的确定方法

我们在进行问卷调查的时候&#xff0c;问卷的收集数量是重要的流程之一。问卷数量取决于几个因素&#xff0c;包括研究的目的和研究的类型。接下来&#xff0c;我们就聊一聊怎么确定所需的调查问卷数量。 1、确定研究目标。 确定所需问卷数量的第一步是明确研究目标。这一步是…

jar包依赖冲突该怎么解决(IT枫斗者)

jar包依赖冲突该怎么解决&#xff08;IT枫斗者&#xff09; maven jar包依赖规则 间接依赖路径最短优先一个项目依赖了a和b两个jar包&#xff0c;其中a-b-c1.0&#xff0c;d-e-c1.0,由于c1.0路径最短&#xff0c;所以项目最后使用的jar包是c1.0pom文件中申明顺序优先有人就问…

使用三轴XYZ平台绘制空心字

1. 功能说明 本文示例将实现R312三轴XYZ平台绘制“机器时代”空心字的功能。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1扩展板 SH-ST步进电机扩展…

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看

鉴于现在严峻的就业形势&#xff0c;千万大学生即将出新手村&#xff0c;今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题&#xff0c;与君共勉&#xff01; 一、开场白 Q&#xff1a;简单自我介绍一下吧 Q&#xff1a;项…

Bots攻击威胁石油石化企业 瑞数动态安全实现从“人防”到“技防”

近日&#xff0c;中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛在京召开。本届大会由中国石油学会、中国石油、中国石化、中国海油、国家管网、国家能源、中国中化、中国航油、延长石油、中国地质调查局等单位共同主办。 作为我国石油石化行业的盛会&#xf…

论坛现场回顾:维视教育的新工科人才培养 「最佳实践 」

全国高校电子信息类专业教学论坛隆重召开 由教育部高等学校电子信息类专业教学指导委员会主办&#xff0c;苏州大学、清华大学出版社承办的“全国高校电子信息类专业教学论坛”于2023年4月14日-16日在江苏省苏州市隆重开幕&#xff0c;维视教育作为电子信息类教学指导委员会战略…

最优化方法Python计算:连续函数的单峰区间计算

我们知道&#xff0c;闭区间上的一元连续函数必在区间上取得最大值和最小值。实践中我们需要能数值地确定含有 f ( x ) f(x) f(x)的唯一最优解 x 0 x_0 x0​的区间 [ a , b ] [a,b] [a,b]。这里介绍寻求连续函数 f ( x ) f(x) f(x)在一点 x ∗ x^* x∗附近单峰区间的包围算法及…