当前位置: 首页 > article >正文

RabbitMQ之旅(1)

相信自己,终会成功

目录

主流MQ产品

1.kafaka 

2.RocketMQ

3.RabbitMQ

在xshell上安装RabbitMQ

 RabbitMQ七种工作模式

1.简单模式

​编辑

2.工作队列模式

3.发布/订阅模式

4.路由模式

5.通配符模式

6.RPC模式

AMQP.BasicProperties 设置消息属性的类

7.发布确认模式

代码展示(生产者)

常量命名规范

连接工厂 (ConnectionFactory) 

Channel(通道)

channel.queueDeclare 声明队列

channel.basicPublish 发送消息

channel.exchangeDeclare 声明创建交换机

channel.queueBind() 将队列绑定到交换机

channel.basicQos设置消费者预取限制

channel.basicAck 手动确认消息

代码展示(消费者)

DefaultConsumer:

handleDelivery 方法:


主流MQ产品

1.kafaka 

  1. 特点:高吞吐量、分布式、持久化、支持分区和副本。
  2. 适用场景:日志收集、流处理、实时数据分析等大数据场景。
  3. 优势:高吞吐量和低延迟,适合处理大量数据。
  4. 缺点:配置复杂,对小型项目可能过于重量级。

2.RocketMQ

  1. 特点:分布式、高吞吐量、低延迟、支持事务消息。
  2. 适用场景:电商、金融等需要高可靠性和事务支持的场景。
  3. 优势:支持事务消息,适合金融等高可靠性要求的场景。
  4. 缺点:社区相对较小,文档和资源不如Kafka丰富。

3.RabbitMQ

  1. 特点:轻量级、支持多种消息协议、易于使用和部署。
  2. 适用场景:中小型项目、需要快速上手的场景。
  3. 优势:易于使用,支持多种消息协议,社区活跃。
  4. 缺点:在大规模高并发场景下性能不如Kafka和RocketMQ。

在xshell上安装RabbitMQ

1.更新xshell中最新的软件包列表

sudo apt-get update

2.安装erlang

sudo apt-get install erlang

输入erl,出现下图内容表示安装成功  输入halt().退出即可

 3.安装rabbitmq

sudo apt-get install rabbitmq-server

4.确认安装结果

systemctl status rabbitmq-server

 显示running即可

 5.安装RabbitMQ管理界面

rabbitmq-plugins enable rabbiting_management

6.启动服务

sudo service rabbitmq-server start

在浏览器中输入自己云服务器的端口号+15672即可访问页面

添加用户名和密码 

rabbitmqctl add_user 用户名 密码

给用户权限

rabbitmqctl set_user_tags 用户名 权限等级

 RabbitMQ七种工作模式

P:生产者        C:消费者

queue:队列   X:交换机

在使用绑定的时候为 BindingKey

在发送消息的时候为RoutingKey

官方网站:RabbitMQ Tutorials | RabbitMQ

建立连接需要的信息:

1.IP   2.端口号   3.账号   4.密码   5. 虚拟主机

消费者代码:

1.创建连接  2.创建Channel  3.声明一个队列Queue  4.消费信息  5.释放资源

1.简单模式

一个生产者,一个消费者,点到点模式

2.工作队列模式

一个生产者,多个消费者

假如有十条队列消息,C1和C2是共同消费这10条消息,消息不会重复消费

3.发布/订阅模式

4.路由模式

订阅模式的变化形式

5.通配符模式

6.RPC模式

AMQP.BasicProperties 设置消息属性的类
属性名类型说明
contentTypeString消息内容的 MIME 类型(如 text/plainapplication/json)。
contentEncodingString消息内容的编码方式(如 UTF-8)。
headersMap<String, Object>自定义消息头,用于传递额外信息。
deliveryModeInteger消息的持久化模式:1(非持久化)或 2(持久化)。
priorityInteger消息的优先级(0 到 9,数值越大优先级越高)。
correlationIdString关联 ID,通常用于 RPC 模式,匹配请求和响应。
replyToString响应队列的名称,通常用于 RPC 模式。
expirationString消息的过期时间(以毫秒为单位的字符串)。
messageIdString消息的唯一标识符。
timestampDate消息的时间戳。
typeString消息的类型标识符。
userIdString用户 ID,用于验证消息的发送者。
appIdString应用程序 ID,用于标识发送消息的应用程序。
//        AMQP.BasicProperties 是一个不可变类,因此需要通过其内部类 Builder 来创建对象。AMQP.BasicProperties props = new AMQP.BasicProperties().builder().correlationId(correlationID).replyTo(Constants.RPC_RESPONSE_QUEUE).build();
  1. 客户端

    • 生成唯一的 correlationId

    • 设置 replyTo 为响应队列的名称。

    • 发送消息到请求队列(Constants.RPC_REQUEST_QUEUE)。

    • 监听响应队列(Constants.RPC_RESPONSE_QUEUE),等待服务器返回结果。

  2. 服务器

    • 监听请求队列(Constants.RPC_REQUEST_QUEUE)。

    • 处理请求后,将结果发送到客户端指定的响应队列(replyTo)。

    • 在响应消息中设置与请求相同的 correlationId

  3. 客户端匹配响应

    • 收到响应后,根据 correlationId 匹配对应的请求。

7.发布确认模式

是RabbitMQ消息可靠性保证的关键 


代码展示(生产者)

下图的代码Constants是自己写的 Java 常量

常量命名规范

1.常量名使用 全大写字母,并用下划线 _ 分隔单词(如 VIRTUALHOST 和 WORK_QUEUE)。

2.这是 Java 中的命名约定,便于区分常量和变量。 

//1. 建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST); //云服务器的IP地址connectionFactory.setPort(Constants.PORT); //需要提前开放端口号connectionFactory.setUsername(Constants.USER_NAME);//账号connectionFactory.setPassword(Constants.PASSWORD);  //密码connectionFactory.setVirtualHost(Constants.VIRTUALHOST); //虚拟主机//2. 开启信道Channel channel = connection.createChannel();//3. 声明交换机   使用内置的交换机

连接工厂 (ConnectionFactory) 

是一个设计模式中的“工厂类”,它的目的是隐藏创建连接的复杂细节(比如网络配置、认证信息等)。你可以通过这个工厂对象预先设置连接参数(如服务器地址、端口、用户名、密码等),然后通过它来生成具体的连接对象

Channel(通道)

通道 是建立在连接(Connection)之上的一个轻量级逻辑连接。一个连接(Connection)可以创建多个通道,每个通道可以独立地发送和接收消息。通道的设计是为了复用连接,避免频繁创建和销毁连接的开销。创建通道后,通常会用它来声明队列、发送消息或消费消息

channel.queueDeclare 声明队列
//4.声明队列channel.queueDeclare(Constants.WORK_QUEUE,true,false,false,null);/*** queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,*                                  Map<String, Object> arguments)*  参数说明:*  queue: 队列名称*  durable: 可持久化*  exclusive: 是否独占*  autoDelete: 是否自动删除*  arguments: 参数*/

channel.basicPublish 发送消息
        //5. 发送消息/*** basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)* 参数说明:* exchange: 交换机名称* routingKey: 内置交换机, routingkey和队列名称保持一致* props: 属性配置* body: 消息*/for (int i = 0; i < 10; i++) {String msg = "hello rabbitmq~"+i;channel.basicPublish("","hello", null, msg.getBytes());}

 //6. 资源释放channel.close();connection.close();
channel.exchangeDeclare 声明创建交换机
Exchange.DeclareOk exchangeDeclare(String exchange,              // 交换机名称String type,                  // 交换机类型(direct、fanout、topic、headers)boolean durable,              // 是否持久化boolean autoDelete,           // 是否自动删除boolean internal,            // 是否内部交换机Map<String, Object> arguments // 额外参数
) throws IOException;

channel.queueBind() 将队列绑定到交换机
  • queue:队列名称(如 Constants.PUBLISH_QUEUE1)。

  • exchange:交换机名称(如 Constants.PUBLISH_EXCHANGE)。

  • routingKey:路由键(如 "" 或 "key1"

channel.queueBind(Constants.PUBLISH_QUEUE1, Constants.PUBLISH_EXCHANGE, "");
channel.queueBind(Constants.PUBLISH_QUEUE2, Constants.PUBLISH_EXCHANGE, "");
//作用:将 Constants.PUBLISH_QUEUE1 和 Constants.PUBLISH_QUEUE2 绑定到 //Constants.PUBLISH_EXCHANGE。
//路由键为空字符串(""),表示所有消息都会被路由到这两个队列(前提是交换机类型支持)。
channel.basicQos设置消费者预取限制
参数名类型说明
prefetchSizeint预取消息的总大小(以字节为单位),通常设置为 0 表示不限制大小。
prefetchCountint预取消息的数量限制(即未确认消息的最大数量)。
globalboolean是否全局生效:true 表示对整个 Channel 生效,false 表示对每个消费者生效。
// 设置每个消费者最多预取 10 条未确认消息
channel.basicQos(10);// 设置整个 Channel 最多预取 100 条未确认消息
channel.basicQos(100, true);// 设置预取消息的总大小不超过 1MB,数量不超过 10 条
channel.basicQos(1024 * 1024, 10, false);
channel.basicAck 手动确认消息
参数名类型说明
deliveryTaglong消息的唯一标识符,由 RabbitMQ 分配。
multipleboolean是否批量确认:true 表示确认所有比 deliveryTag 小的消息;false 表示仅确认当前消息。

使用场景

  • 手动确认模式:当消费者从队列中拉取消息时,如果启用了手动确认模式(autoAck=false),则必须调用 basicAck 来确认消息。

  • 确保消息可靠性:通过手动确认,可以确保消息在处理成功后才会从队列中删除,避免消息丢失。

  • 批量确认:通过设置 multiple=true,可以一次性确认多条消息,提高效率。


代码展示(消费者)

public static void main(String[] args) throws IOException, TimeoutException {//1. 建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT); //需要提前开放端口号connectionFactory.setUsername(Constants.USER_NAME);//账号connectionFactory.setPassword(Constants.PASSWORD);  //密码connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST); //虚拟主机Connection connection = connectionFactory.newConnection();//2. 开启信道Channel channel = connection.createChannel();//3. 声明队列   使用内置的交换机//如果队列不存在, 则创建, 如果队列存在, 则不创建channel.queueDeclare(Constants.WORK_QUEUE, true, false, false, null);//4. 消费消息DefaultConsumer consumer = new DefaultConsumer(channel){//从队列中收到消息, 就会执行的方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:"+ new String(body));}};channel.basicConsume(Constants.WORK_QUEUE, true, consumer);6. 资源释放channel.close();connection.close();}

DefaultConsumer

RabbitMQ 提供的默认消费者类。

channel:消费者绑定的通道(Channel)。

匿名内部类:通过 new DefaultConsumer(channel) { ... } 创建一个匿名内部类,并写 handleDelivery 方法。

handleDelivery 方法

当队列中有消息时,RabbitMQ 会调用此方法将消息传递给消费者

RabbitMQ 支持两种消息确认模式:

  1. 自动确认

    • 在 basicConsume 方法中将第二个参数设置为 true

    • 消费者接收到消息后,RabbitMQ 会自动将消息标记为已处理。

    • 示例:

      channel.basicConsume(QUEUE_NAME, true, consumer);
  2. 手动确认

    • 在 basicConsume 方法中将第二个参数设置为 false

    • 需要在 handleDelivery 方法中手动调用 channel.basicAck() 确认消息。

    • 示例:

      channel.basicAck(envelope.getDeliveryTag(), false);


相关文章:

RabbitMQ之旅(1)

相信自己,终会成功 目录 主流MQ产品 1.kafaka 2.RocketMQ 3.RabbitMQ 在xshell上安装RabbitMQ RabbitMQ七种工作模式 1.简单模式 ​编辑 2.工作队列模式 3.发布/订阅模式 4.路由模式 5.通配符模式 6.RPC模式 AMQP.BasicProperties 设置消息属性的类 7.发布确认模…...

golang坐标转换 gomap3d库

gomap3d Go语言实现的多坐标系转换库&#xff0c;支持天文学/航天领域常用坐标系转换 基础算子支持c gomap3d 特性 支持5种坐标系互转&#xff1a; 站心坐标系 (AER)东北天坐标系 (ENU)地心地固坐标系 (ECEF)地心惯性坐标系 (ECI)大地坐标系 (LLA) 支持多种参考椭球体&#…...

llvm数据流分析

llvm数据流分析 1.数据流分析2.LLVM实现2.1.常量传播2.2.活跃性分析 相关参考文档&#xff1a;DataFlowAnalysisIntro、ustc编译原理课程、南大程序分析课程1、南大程序分析课程2。 1.数据流分析 数据流分析在编译优化等程序分析任务上都有重要应用。通常数据流分析可被抽象为…...

HTML-网页介绍

一、网页 1.什么是网页&#xff1a; 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…...

【C#学习笔记03】进制转换与反码、补码、原码

1. 进制转换 计算机中的数据通常以二进制形式存储&#xff0c;但在编程和调试过程中&#xff0c;我们经常需要与十进制、八进制和十六进制打交道。因此&#xff0c;掌握进制转换是C语言学习中的重要一环。 1.1 进制的基本概念 二进制&#xff08;Binary&#xff09;&#xff…...

DeepSeek Kimi详细生成PPT的步骤

以下是使用 DeepSeek 和 Kimi 协作生成 PPT 的详细步骤&#xff0c;结合了两者的优势实现高效创作&#xff1a; 第一步&#xff1a;使用 DeepSeek 生成 PPT 大纲或内容 明确需求并输入提示词 在 DeepSeek 的对话界面中&#xff0c;输入具体指令&#xff0c;要求生成 PPT 大纲或…...

python学智能算法(七)|KNN邻近算法

【1】引言 前述学习进程中&#xff0c;已经了解了一些非常经典的智能算法&#xff0c;相关文章包括且不限于&#xff1a; python学智能算法&#xff08;三&#xff09;|模拟退火算法&#xff1a;深层分析_模拟退火 动画演示-CSDN博客 python学智能算法&#xff08;四&#x…...

Java数据结构第二十二期:Map与Set的高效应用之道(一)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…...

兴达易控modbusTCP转profinet接防撞雷达测试

modbusTCP转profinet接防撞雷达测试 随着工业自动化程度的不断提高&#xff0c;现场设备之间的通信需求日益增长。ModbusTCP作为一种广泛应用的工业通信协议&#xff0c;因其简单、可靠的特点&#xff0c;被广泛应用于各种自动化设备中。而Profinet作为工业以太网的一种&#…...

flutter实践:断点调试踩坑

问题&#xff1a;使用VSCode开发flutter,最近突然开始打断点不生效&#xff0c;程序可以attach,修改有日志输出&#xff0c;但是断点处怎么都停不了&#xff0c;程序异常断点会停。 分析&#xff1a;开始误以为是flutterSDK出了问题折腾了一天&#xff0c;后来又怀疑是lauch.j…...

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…...

二、docker 存储

docker四种方式&#xff1a;默认、volumes数据卷、bind mounts挂载、tmpfs mount(仅在linux环境中提供)&#xff0c;其中volumes、bind mounts两种实现持久化容器数据&#xff1b; 默认&#xff1a;数据保存在运行的容器中&#xff0c;容器删除后&#xff0c;数据也随之删除&am…...

Photo Works在线图片编辑器:一键修复老照片,轻松焕新记忆

★【概况介绍】 今天突然收到我的朋友电脑出故障了,截图给我,我一看就知道这个是缺少必要的组件引起的故障。结合这个问题,我来谈谈自己的解决思路和方法,希望能够帮助到大家。帮助大家是我最开心的事情。以前只是帮朋友解决问题,没有记录下来,刚刚接触到这个平台,刚好可…...

SQLiteStudio:一款免费开源跨平台的SQLite管理工具

目录 1.简介 2.下载与安装 3.实现分析 4.总结 1.简介 SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具&#xff0c;由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中&#xff0c;而 SQLi…...

Markdown 语法入门指南(VSCode 版)

此博客为一份详细的 Markdown 语法入门指南&#xff0c;专门针对在 VSCode 上使用 Markdown 的零基础用户。这份指南将包括 Markdown 的基础语法、在 VSCode 中的安装与使用方式、常见问题及注意事项。 Markdown 是一种轻量级标记语言&#xff0c;使用纯文本符号来标记格式&am…...

PostgreSQL学习笔记:PostgreSQL vs MySQL

PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统&#xff0c;它们有以下一些对比&#xff1a; 一、功能特性 1. 数据类型支持 PostgreSQL&#xff1a;支持丰富的数据类型&#xff0c;包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…...

Vite为什么选用Rollup打包?

Vite 在生产阶段使用 Rollup 打包&#xff0c;但这不是唯一选择。它的设计背后有明确的权衡和考量&#xff0c;同时开发者也可以选择其他替代方案。 一、为什么 Vite 默认使用 Rollup&#xff1f; 1. Rollup 的核心优势 • Tree-shaking&#xff1a;Rollup 的静态分析能力极强&…...

内存检测工具——Qt Creator

前言 检测内存错误的工具&#xff0c;有很多个&#xff0c;我今天粗浅的学了一下可在Qt上使用的工具们&#xff1a; Dr.Memory 工具之前我曾在关注的博主上看到相关的博客&#xff1a;C(Qt)软件调试---内存调试器Dr.Memory&#xff08;21&#xff09;_dr. memory-CSDN博客 今…...

2.4 基于Vitest的单元测试基础设施搭建

文章目录 1. 现代单元测试体系解析测试金字塔演进Vitest核心定位2. 基础设施架构设计整体架构图3. 环境配置全流程3.1 基础环境搭建3.2 配置文件`vitest.config.ts`3.3 测试环境初始化4. 测试用例编写规范4.1 基础测试示例4.2 Vue组件测试4.3 异步逻辑测试5. Mock策略深度优化5…...

如何在 React 中使用 CSS-in-JS?

在 React 中使用 CSS-in-JS CSS-in-JS 是一种将 CSS 样式与 JavaScript 代码结合在一起的技术&#xff0c;特别流行于 React 应用中。它允许开发者在组件内部定义样式&#xff0c;使得样式与组件逻辑紧密结合&#xff0c;从而提高了可维护性和可读性。本文将深入探讨在 React …...

⭐算法OJ⭐链表排序【归并排序】(C++/JavaScript 实现)

文章目录 148. Sort List解题思路归并排序的基本思想归并排序的步骤 实现实现步骤C 实现JavaScript 实现 复杂度总结 148. Sort List Given the head of a linked list, return the list after sorting it in ascending order. 解题思路 链表排序问题可以通过多种方法解决&am…...

SegMAN模型详解及代码复现

SegMAN模型概述 模型背景 在深入探讨SegMAN模型之前&#xff0c;我们需要了解其研究背景。在SegMAN出现之前&#xff0c;计算机视觉领域的研究主要集中在以下几个方面&#xff1a; 手工制作方法&#xff0c;如SIFT基于卷积神经网络(CNN)的方法&#xff0c;如STN和PTN对平移、…...

Manus AI:多语言手写识别的技术革命与未来图景

摘要&#xff1a;在全球化浪潮下&#xff0c;跨语言沟通的需求日益迫切&#xff0c;但手写文字的多样性却成为技术突破的难点。Manus AI凭借其多语言手写识别技术&#xff0c;将潦草笔迹转化为精准数字文本&#xff0c;覆盖全球超百种语言。本文从技术原理、应用场景、行业价值…...

保姆级别使用Python实现“机器学习“案例

从安装到运行手把手教学,保证不迷路~ 🌈 零基础友好版教程 📦 第一步:安装必备工具包 别慌!这里有两种安装方式,选你顺手的 方式1:用代码自动安装(推荐新手) 直接在你的Python代码最前面加这几行,运行时会自动安装: # 把这坨代码贴在文件最前面! import sys im…...

K8s 1.27.1 实战系列(九)Volume

一、Volume介绍 Volume 指的是存储卷,包含可被Pod中容器访问的数据目录。容器中的文件在磁盘上是临时存放的,当容器崩溃时文件会丢失,同时无法在多个Pod中共享文件,通过使用存储卷可以解决这两个问题。 1、Volume 的核心作用 ​数据持久化与生命周期管理 Volume 的核心目标…...

Stable Diffusion游戏底模推荐

一、基础通用型底模 SDXLbase &#x1f4da; 官方原版底模&#xff0c;支持1024x1024高清出图&#xff0c;适用于各类游戏场景和角色的基础生成&#xff0c;建议作为微调训练的基准模型。 来源: 相关搜索结果 写实风格搭配推荐 &#x1f3a8; 搭配 9realisticSDXL 或 麻袋real…...

GNU Binutils 全工具指南:从编译到逆向的完整生态

1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1.1. 引言1.2. 工具分类速查表1.3. 核心工具详解 1.3.1. 编译与汇编工具 1.3.1.1. as&#xff08;汇编器&#xff09;1.3.1.2. gcc&#xff08;…...

nginx 打造高性能 API 网关(‌Building a High-Performance API Gateway with Nginx)

Nginx 打造高性能 API 网关 引言&#xff1a; 在现代微服务架构中&#xff0c;API 网关扮演着至关重要的角色。它不仅负责统一路由请求&#xff0c;还承担着身份验证、负载均衡、流量控制、日志记录等多重任务。而在众多的 API 网关实现方案中&#xff0c;Nginx 作为一个高性能…...

理解字符流和字节流,节点流和处理流、缓冲流、InputStreamReader、BufferInputStream、BufferReader...

DAY10.2 Java核心基础 IO流 字符流和字节流 字符流和字节流在每次处理数据的单位不同&#xff0c;一个是字符&#xff0c;一个是字节 如果复制文件类型是文本类型&#xff0c;字节流字符流都可以 如果复制的文件类型是非文本类型&#xff0c;则只能使用字节流&#xff0c;使…...

Securing a Linux server

Is your Linux server safe from hackers? Can they get hacked? Freak out about getting your server compromised and getting your data leaked? Take a look at some of the tips you can take to secure and protect your Linux server. 1. SSH security SSH is l…...