图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录

  • 1.消费者模型
  • 2.生产者-消费者模型注意事项
    • 2.1资源释放顺序问题
    • 2.2消费者的声明问题
    • 2.3虚拟机和用户的权限问题
  • 3.七种工作模式
    • 3.1简单模式
    • 3.2工作模式
    • 3.3发布/订阅模式
    • 3.4路由模式
    • 3.5通配符模式
    • 3.6RPC通信
    • 3.7发布确认

1.消费者模型

之前学习的这个消息队列的快速上手,只学习了生产者的这个代码编写,并且可以看到这个生产者生产的这个消息的查看;

今天补充一下这个消费者的:这个消费者的和生产者的在很多的地方都是相似的,,例如前面的这个建立连接,开发信道之类的,就是这个消费者进行这个消费消息的时候是对于这个handleDelivery方法进行重写

image-20241201114400423

1)username这个表示的是我们的admin的名字(也就是我们的用户名字)
2)password是我们创建这个用户的时候设置的密码(不是我们的登录密码)
3)virtualhost就是我们的虚拟主机,这个虚拟主机管理我们创建的这些用户;
4)5672就是消息队列上面的这个默认的端口号;
5)sethost就是我们的云服务器的公网ip地址(我自己是用的云服务器);

下面的这个就是idea的控制台上面打印的这个信息:

image-20241201114218429

这个时候,我们去这个查看:发现数据全部都被释放了,但是原本我们是有很多的信息的,他却只打印了一个信息,因此我们可以设置这个休眠的过程,让这个消费者打印所有的消息;

image-20241201114732895

首先,我们还是需要创建消息,就是让这个生产者进行生产(因为现在已经全部被释放了),我们可以设置一个循环,多生产一些;

image-20241201115048792

这个时候页面会进行自动刷新,我们的这个生产的内容消息就会显示出来:

image-20241201115145573

消费者休眠之后,控制台查看:我们可以发现使用这个休眠之后,信息全部显示出来:

QQ_1733025324888

2.生产者-消费者模型注意事项

2.1资源释放顺序问题

下面的这个就是想要解释我们的资源的释放的问题;

下面的这个是先关闭我们的信道,然后是断开这个生产者和消费者之间的这个链接;

如果我们逆向操作,就是把这个释放资源的先后顺序进行调整,这个时候就会出现问题,这个主要是因为我们的连接断开的时候默认这个信道就关闭了;

因此,我们可以先关闭这个信道,再断开连接,但是不可以断开连接之后关闭信道;

image-20241201180201442

2.2消费者的声明问题

下面的这个声明队列的这个内容是可以省略的(针对于消费者而言的);

前提是我们的这个队列是存在的,这个时候我们的33行指定了这个queue,这个时候不会报错,因为我们即使没有声明,33行使用的时候也是可以找到这个queue的;

但是如果我们把这个queue删除了,就是这个不存在了,这个时候我们进行声明,33行进行使用,这个时候也不会报错,相反,使用的时候会根据我们的这个33行的代码创建这个channel出来;

如果我们的这个queue不存在,我们也不生命,在33行直接使用,这个时候就会报错,因为根本找不到这个队列;

image-20241201180456454

2.3虚拟机和用户的权限问题

1)还是之前说过的这个问题:就是我们的一个虚拟机可以对于多个用户进行管理,这个时候我们需要保证我们操作的这个用户是可以有虚拟机管理的这个权限的,否则是无法进行这个生产和消费的过程的;

2)一般我们日常学习是使用一个虚拟主机,在这个虚拟主机上面对于多个用户进行管理,而且我们的这个用户名密码也需要相互对应,否则也是无法进行消息的发送和接受的;

3.七种工作模式

image-20241201181358770

image-20241201181426384

image-20241201181445511

3.1简单模式

简单模式就是我们上面实现的这个快速上手的案例:只有一个生产者,一个消费者的模式;

P:producer就是生产者;

C:comsumer就是消费者;

Quene:消息队列,对于信息进行缓存,生产者的消息放到这个消息队列里面,消费者从这个消息队列里面取出来消息;

image-20241201182053097

3.2工作模式

这个就是工作模式:一个生产者,多个消费者,生产者生产的消息,分配给所有的这个消费者,但是每一个消费者只是获取这个消息里面的一部分内容;

image-20241201182157183

适用场景:集群环境下面的异步处理;

例如我们只有一个12306,但是又很多的这个用户,这个时候12306就会把这个消息不加重复的给到每一个消费者,也就是我们的用户;

3.3发布/订阅模式

这个x表示的是交换机;

这个时候我们的这个c1和c2消费者接受的就是这个生产者的全部内容;

例如这个p生产的内容是10个消息,这个时候10个消息就会给c1一份,给c2一份,而不是像上面的这个工作模式(工作模式里面的这个消费者加起来的总和只有一份,这个发布模式是每一个消费者都是一份,这个就是两者之间的区别之一);

image-20241201182749228

另外一个区别也是显而易见的,就是我们的交换机,交换机主要是下面的几种类型:

1)fanout:广播,把消息交给所有绑定了交换机的队列,我们的这个发布订阅模式使用的就是这个类型的交换机(这个类型就是不进行任何筛选,只要我们有联系,我的这个消息就会给你一份);

2)direct:定向,这个就是把消息给到指定的这个队列里面去,3.4里面的路由模式使用的这个类型的交换机;

3)topic:通配符,把消息给指定的符合通配符要求的队列里面去,也就是下面的这个3.5里面的交换机的类型;

除此之外,我们需要了解一下这个绑定规则:

1)RoutingKey:这个表示的就是我们的生产者和交换机之间的这个绑定的规则;

2)Binding Key:这个表示的就是我们的路由器和消费者之间的这个绑定的规则;

下面会针对于routingKey和biningkey展开介绍和说明;

3.4路由模式

路由模式就是上面的这个发布订阅模式的变种,只不过是有了一定的这个筛选的标准和规则,这个下面的a,b,c就是对应的选择标准;

例如我们之前学习的这个日志的等级:error,warning,info就可以视为是这个a,b,c,符合这个error级别的消息就会到这个c1里面去,符合这个warning和info级别的就回到这个c2消费者里面去;

image-20241201183854340

3.5通配符模式

和上面的路由模式,这个使用的就是模糊匹配,上面的是相等才可以,我们这个是符合条件就可以,比路由模式更加灵活,使用与需要灵活的处理和进行消息的过滤的场景;

*表示的就是一个字符,#表示的就是一个或者多个字符,这个就是通配符的具体的含义;

image-20241201184728058

3.6RPC通信

1)这个下面就是我们的客户端和服务端,没有生产者和消费者;

2)客户端发送消息到这个指定的队列上面,消息属性里面有这个reply和correlation,这个correlation就是最后和接收到的消息进行校验的,reply就是告诉我们的服务器把返回的消息放到这个指定的队列里面去;

3)我们的服务器就是把消息放到这个指定的毁掉队列reply_to里面去,客户端收到消息之后检查这个correlation属性是不是一样的,确保这个就是自己期望的响应的内容;

image-20241201185522790

3.7发布确认

这个就类似于我们学习网络通信时候的这个里面的确认应答的机制,返回一个ack;

这个是我们的生产者和我们的消息队列服务器之间进行这个消息的确认和应答,没有这个消费者的参与,因为这个就是为了确保我们的这个生产者生产的这个消息被我们的消息队列的这个服务器接收到;

image-20241201184400424

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

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

相关文章

C-操作符

操作符种类 在C语言中,操作符有以下几种: 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用,函数调用 拓展:整型提升 我们介绍常用的几个 算术操作符 (加)&#xff…

使用 Spring Boot 和 GraalVM 的原生镜像

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计&#xf…

基于Java Springboot宠物医院微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…

C#使用ExcelDataReader读取Xlsx文件为DataTable对象

创建控制台项目 在NuGet中安装ExcelDataReader.DataSet 3.7.0 创建一个xlsx文件 测试代码 读取xlsx文件内容,为一个DataTable对象。 读取xlsx时,xlsx文件不能被其他软件打开,否则会报“进程无法访问此文件”的错。 using ExcelDataRead…

【JavaEE初阶】应是天仙狂醉,乱把白云揉碎 - (重点)线程

本篇博客给大家带来的是线程的知识点, 由于内容较多分几天来写. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ⭐欢迎大家点赞 评论 收藏 分享 ❤❤❤ 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 认识线程 1.1 概念 )1 …

精准用户获取与私域流量运营:多商户链动 2+1 模式商城小程序的赋能策略

摘要:本文聚焦于精准用户对商业运营的核心价值,深入剖析获取精准用户的有效途径,特别围绕目标用户画像及出没场景展开分析。同时,探讨在私域流量构建进程中,多商户链动 21 模式商城小程序如何融入精准用户运营体系&…

Spring Boot教程之十一:获取Request 请求 和 Put请求

如何在 Spring Boot 中获取Request Body? Java 语言是所有编程语言中最流行的语言之一。使用 Java 编程语言有几个优点,无论是出于安全目的还是构建大型分发项目。使用 Java 的优点之一是 Java 试图借助类、继承、多态等概念将语言中的每个概念与现实世…

DVWA靶场文件包含(File Inclusion)通关教程(high级别)

目录 DVWA 靶场建立闯关 DVWA 靶场建立 需要的东西: phpStudy: 链接: phpStudy 提取码:0278 DVWA-master 链接: DVWA靶场 提取码:0278 建议在虚拟机中操作,以防数据库冲突,下面有…

基于yolov8、yolov5的铝材缺陷检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:铝材缺陷检测在现代工业生产和质量管理中具有重要意义,不仅能帮助企业实时监控铝材质量,还为智能化生产系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的铝材缺陷检测模型,该模型使用了大量包含…

力扣刷题TOP101:8.BM10 两个链表的第一个公共结点

目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表,它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏,实际上背地里都偷…

哪些行业对六西格玛管理方法的需求较大?

六西格玛作为一种追求极致质量和流程优化的管理哲学,自诞生以来,便在多个行业中展现出了巨大的应用价值。该方法通过定义、测量、分析、改进和控制(DMAIC)五个阶段,帮助企业实现流程的持续改进,提高产品质量…

Spring Web MVC其他扩展(详解下)

文章目录 Spring MVC其他扩展(下)异常处理异常处理机制声明式异常好处基于注解异常声明异常处理 拦截器拦截器概念拦截器使用拦截器作用位置图解拦截器案例拦截器工作原理源码 参数校验校验概述操作演示SpringMVC自定义参数验证ValueObject(VO) 文件上传…

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…

【linux学习指南】Linux进程信号产生(三) 硬件异常除零出错?野指针异常?core文件

文章目录 📝前言🌠模拟除0🌉除0出错?🌉野指针异常? 🌠⼦进程退出coredump🌉Core Dump 🚩总结 📝前言 硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前…

【人工智能-科普】图神经网络(GNN):与传统神经网络的区别与优势

文章目录 图神经网络(GNN):与传统神经网络的区别与优势什么是图神经网络?图的基本概念GNN的工作原理GNN与传统神经网络的不同1. 数据结构的不同2. 信息传递方式的不同3. 模型的可扩展性4. 局部与全局信息的结合GNN的应用领域总结图神经网络(GNN):与传统神经网络的区别与…

青藤云安全携手财信证券,入选金融科技创新应用优秀案例

11月29日,由中国信息通信研究院主办的第四届“金信通”金融科技创新应用案例评选结果正式发布。财信证券与青藤云安全联合提交的“基于RASP技术的API及数据链路安全治理项目”以其卓越的创新性和先进性,成功入选金融科技创新应用优秀案例。 据悉&#x…

Python系列 - MQTT协议

Python系列 - MQTT协议 资源连接 MQTT的介绍和应用场景的示例说明 一、什么是MQTT 百度关于MQTT的介绍如下: MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布订阅范式的消息协议。它工作在 TCP/IP协议之上,是为硬件性能低下的远程设…

winform跨线程更新界面

1、报错代码 下面的代码中的this.Text指的是一个winform的窗体,开启Task执行下面的代码以后直接报错,提示线程间操作无效,这是因为在WinForms应用程序中,UI元素(如控件)通常只能在创建它们的线程&#xff…

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看:Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1,编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数,…