消息队列篇--原理篇--RabbmitMQ(Exchange,消息转换器、docker部署,绑定和确认机制等)

news2025/1/23 4:26:45

RabbitMQ是一个基于AMQP协议的消息队列系统,支持多种消息传递模式,包括点对点(P2P)、发布/订阅(Pub/Sub)和路由模式。RabbitMQ 的设计目标是提供高可用性、可扩展性和可靠性,适用于企业级应用集成、任务调度、异步处理等场景。

1、特点

  • 多语言支持:RabbitMQ支持多种编程语言的客户端库,如Java、Python、C++、Go等。
  • 丰富的消息传递模式:支持P2P、Pub/Sub和路由模式,满足不同的业务需求。
  • 持久化和事务支持:RabbitMQ支持消息的持久化存储和事务处理,确保消息不会丢失。
  • 插件机制:RabbitMQ提供了丰富的插件机制,可以扩展其功能,例如监控、管理、安全等。
  • 高可用性和集群支持:RabbitMQ支持集群部署,提供高可用性和水平扩展能力。
  • 可视化管理界面:RabbitMQ提供了一个Web管理界面,方便用户管理和监控队列、交换机、消费者等。

2、核心概念

(1)、生产者(Producer)

  • 定义:生产者是向RabbitMQ发送消息的应用程序。它可以将消息发送到交换机(Exchange),也可以直接发送到队列(Queue)。
  • 职责:负责生成和发送消息,通常不需要关心消息的路由和消费情况。

(2)、消费者(Consumer)

  • 定义:消费者是从RabbitMQ队列中接收消息的应用程序。它可以订阅一个或多个队列,并处理接收到的消息。
  • 职责:负责从队列中拉取消息并进行处理,确保消息被正确处理后确认(ACK)。

(3)、交换机(Exchange)

  • 定义:交换机是RabbitMQ中的核心组件之一,负责接收生产者发送的消息,并根据路由规则将消息转发到一个或多个队列。
  • 类型:
    • Direct Exchange:根据精确的路由键(Routing Key)将消息转发到指定的队列。
    • Fanout Exchange:将消息广播到所有绑定的队列,忽略路由键。
    • Topic Exchange:根据路由键的模式匹配(如通配符)将消息转发到符合条件的队列。
    • Headers Exchange:根据消息头中的属性进行路由,而不是路由键。

(4)、队列(Queue)

  • 定义:队列是存储消息的地方。消息会按照先进先出(FIFO)的原则从队列中取出。
  • 特性:
    • 持久化:可以选择是否将队列和消息持久化到磁盘,确保在服务器重启后消息不会丢失。
    • 排他性:可以创建排他队列,只有创建该队列的连接可以访问它。
    • 自动删除:可以在没有消费者时自动删除队列。

(5)、绑定(Binding)

  • 定义:绑定是将队列与交换机关联起来的机制。通过绑定,交换机可以知道将消息发送到哪些队列。
  • 作用:定义了交换机和队列之间的关系,决定了消息如何从交换机路由到队列。

(6)、消息(Message)

  • 定义:消息是生产者发送给消费者的单位数据。每个消息包含两部分:消息体(Body)和消息属性(Properties)。
  • 属性:
    • Delivery Mode:决定消息是否持久化(1表示非持久化,2表示持久化)。
    • Content Type:指定消息的内容类型(如application/json、text/plain等)。
    • Headers:可以包含自定义的键值对,用于传递额外的元数据。
    • Routing Key:用于指定消息的目标队列或交换机。

(7)、确认机制(Acknowledgment)

  • 定义:当消费者成功处理完一条消息后,必须向RabbitMQ发送确认(ACK)。只有在收到确认后,RabbitMQ才会将该消息从队列中移除。
  • 确认方式:
    • 手动确认:消费者显式调用ack()方法确认消息。
    • 自动确认:消费者在接收到消息后立即自动确认,适合简单场景,但可能会导致消息丢失。

3、架构示意图

RabbitMQ的结构大致如下图,对于Publisher,Consumer,Exchange,Queue几个概念在上面已经做了解释。
Virtual Host:虚拟主机,是对exchange和queue等资源的逻辑分组。
Channel:每次连接建立的通道。可以理解为如图Publisher,Consumer与RabbitMQ之间的连线。

示例图:
在这里插入图片描述

工作流程:
第一步:Publisher建立与RabbitMQ的通道Channel,通过该Channel把Message发送给消息队列。
第二步:消息队列的exchange和queue都可以接收Publisher发送的消息。exchange可以理解为是路由器,之后会把消息转发到具体queue上,在被消费。

  • queue直接接收消息一般用于点对点模式的场景。
    关系:Publisher–>queue–>Consumer
  • exchange接收消息,在将消息转发给对应的queue,一般用于发布订阅的场景。
    关系:Publisher–>exchange–>queue–>Consumer
    第三步:Consumer建立与RabbitMQ的通道Channel,通过该Channel消费指定queue的消息。

4、Exchange分类

Exchange交换机是RabbitMQ中的核心组件之一,负责接收生产者发送的消息,并根据路由规则将消息转发到一个或多个队列。
类型:

  • Fanout Exchange:将消息广播到所有绑定的队列,忽略路由键。
  • Direct Exchange:根据精确的路由键(Routing Key)将消息转发到指定的队列。
  • Topic Exchange:根据路由键的模式匹配(如通配符)将消息转发到符合条件的队列。

(1)、Fanout广播(单提供,多消费)

模型:
交换机和队列需要绑定关系。生产者的消息发给交换机,而不是直接发给队列,交换机会把消息转发给绑定的队列中,在进行广播消费。
在这里插入图片描述
代码示例:
配置类:
配置1个广播(Fanout)交换机和两个队列(指定名称),并将交换机和两个队列关系绑定。
在这里插入图片描述
消费者类:
监听两个队列。
在这里插入图片描述
提供者类:
消息发布到交换机上,由交换机的绑定关系转发到指定的队列中。
在这里插入图片描述

(2)、Direct路由(广播增强版)

广播模式下,只要消费者订阅了队列,就能消费队列的所有消息。
路由模式相对广播模式,增加了key的概念(可以理解为主题)。发送者发送消息时指定消息的key。消费者可以仅配置对应key的消息进行消费,而无需全部都接收。

示例理解:
某个新闻APP可以推送所有的体育新闻。用户A希望仅关注篮球的新闻,用户B希望仅关注羽毛球的新闻,用于C希望能看到篮球和羽毛球两种类型的新闻。那么分别把这几种类型的新闻转发到不同key的队列中,用户根据自己的意愿分别订阅不同key的新闻就可以了。

示例图:
在这里插入图片描述
代码示例:
消费者示例:

需要指定监听的队列,指定监听的交换机为路由模式,指定key。
在这里插入图片描述
生产者示例:
需要指定交换机和发送消息的key。
在这里插入图片描述

(3)、Topic主题(路由的增强版本)

Topic主题在路由的基础上,增加了通配符去标识一类key,简化了key的配置。
如:china.#,可以匹配china. china.news, china.weather…

示例图:
在这里插入图片描述

代码示例:
消费者示例:
指定监听的队列,监听交换机及模式topic,指定key(可加通配符)。
在这里插入图片描述
生产者示例:
指定key如果符合的队列的key,队列就会收到消息。
在这里插入图片描述

5、消息转换器

因为消息队列不仅可以传string对象的消息,还可以传Object等任意数据类型的消息。
如果传Object对象消息时,会序列化后保存到队列中。默认序列化是MessageConverter实现,底层是jdk的序列化,这样在消息队列中我们不仅看不懂消息,且占用的消息体会很大,浪费资源。所以可以使用类型转换器进行转换。

默认序列化后的消息如下:
在这里插入图片描述
解决方法:
配置JSON序列化器替代默认的序列化器。

代码示例:(生产者)
导入依赖:
在这里插入图片描述

注入json的序列化器:
注入的JSON转换器会替换默认JDK的MessageConverter转换器。
在这里插入图片描述

再次调用生产者生产消息:
可以看到很短,能看懂的消息。
在这里插入图片描述

消费者示例:
如果生产者自定义了消息序列化器,那么消费者也要注入相同的序列化器,不然解析会乱码。
导入依赖:
在这里插入图片描述

注入json的序列化:
需要和发送者序列化器一致,否则会造成消息乱码。
在这里插入图片描述

注意,消费者的入参消息需要和生产者发送的消息数据类型也要保持一致。建议:可以都使用Map<String,Object>对象。
在这里插入图片描述

6、RabbitMQ部署–docker

(1)、加载镜像

如果没有压缩过的tar镜像,可以直接使用pull命令拉取指定版本的镜像。
在这里插入图片描述

(2)、查看镜像

在这里插入图片描述

(3)、创建容器,指定用户名admin,密码123321,15672为可视化端口,5672为服务端口

命令示例:

docker run \
 -e RABBITMQ_DEFAULT_USER=admin \
 -e RABBITMQ_DEFAULT_PASS=123321 \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

运行结果:
在这里插入图片描述

(4)、查看启动信息

在这里插入图片描述

(5)、打开浏览器查看

如上的启动命令中,15672为web访问端口,5672为业务端口。
在这里插入图片描述

(6)、输入启动时的用户名和密码即可登录

在这里插入图片描述

7、应用场景

  • 企业级应用集成:RabbitMQ适合用于不同系统之间的解耦和异步通信。
  • 任务调度和异步处理:可以将任务放入队列中,由后台进程逐步处理,避免阻塞主线程。
  • 事件驱动架构:支持Pub/Sub模式,适用于构建事件驱动的应用程序。

乘风破浪会有时,直挂云帆济沧海!!!

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

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

相关文章

C++入门 详细版

欢迎来到干货小仓库&#xff01;&#xff01; 一分耕耘一分收获&#xff0c;离自己的目标越来越近。 passion&#xff01;passion&#xff01;&#xff01;passion&#xff01;&#xff01;&#xff01; 1.命名空间 由于C语言无法避免名字或者函数重复等问题&#xff0c;当有多…

一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用

文章目录 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. preload和prefetch的区别2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白话讲清楚webpack基本使用——9——…

Android AutoMotive --CarService

1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统&#xff0c;它是基于现有Android系统的基础上增加了新特性&#xff0c;最主要的就是增加了CarService&#xff08;汽车服务&#xff09;模块。我们很容易把Android AutoMotive和Android Auto搞混&…

(三)线性代数之二阶和三阶行列式详解

在前端开发中&#xff0c;尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里&#xff0c;行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面&#xff0c;我将结合具…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…

‘list‘ object has no attribute ‘mul‘

原来运行得好好的&#xff0c;突然出现错误&#xff1a;list object has no attribute mul &#xff0c;更换一个输入路径&#xff0c;又没问题&#xff0c;改一个路径&#xff0c;还是出现错误&#xff0c;很奇怪&#xff0c;后来又没有问题&#xff0c;记录一下。 参考这文…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的旅行社在线预订与行程管理系统

开题报告 本文旨在设计研究与开发一个旅行社在线预订与行程管理系统。首先&#xff0c;本文介绍了旅行社在线预订与行程管理系统相关技术集成开发环境、软硬件环境&#xff0c;SpringBoot框架、Vue.js框架的基本原理和优势&#xff0c;以及在旅行社在线预订与行程管理系统开发…

HarmonyOS快速入门

HarmonyOS快速入门 1、基本概念 UI框架&#xff1a; HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用&#xff0c;可能需要进行项目切换管理&#xff0c;所以这里创建一个项目管理页面&#xff0c;登录成功后跳转这个页面&#xff0c;进行选择项目&#xff0c;再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境&#xff1a;CANoe、待测设备&#xff08;包含UDS诊断模块&#xff09; 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

C++ 类- 构造和析构

空类 class A {};空类大小&#xff1a; sizeof(A) 1编译器会默认生成 6 个成员函数&#xff1a; class A { public:A();//构造函数 - 完成对象初始化工作~A();//析构函数 - 完成对象的资源清理A(const A& a);//拷贝构造函数 - 使用同一类中之前创建的对象来初始化新创建…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…