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

RabbitMQ中的Topic模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理,支持多种消息传递模式,其中 Topic 模式 是一种灵活且强大的模式,允许生产者和消费者通过通配符匹配的方式进行消息传递。本文将深入探讨 RabbitMQ 中 Topic 模式的工作原理,并通过 Java 代码示例展示其实现方式。


1. Topic 模式的工作原理

1.1 Topic 模式概述

在 RabbitMQ 中,Topic 模式是基于 交换机类型为 topic 的一种消息传递模式。与 Direct 模式(精确匹配)和 Fanout 模式(广播)不同,Topic 模式允许生产者发送消息到特定的交换机,并根据消息的 路由键(Routing Key)绑定键(Binding Key) 的匹配规则,将消息分发到相应的队列。

在这里插入图片描述

1.2 关键概念

1.2.1 交换机(Exchange)

在 Topic 模式中,消息不会直接发送到队列,而是发送到一个 topic 类型的交换机。交换机根据消息的路由键和队列的绑定键进行匹配,决定将消息分发到哪些队列。

1.2.2 路由键(Routing Key)

路由键是生产者在发送消息时指定的字符串,用于描述消息的主题或类别。路由键通常由多个单词组成,单词之间用点号(.)分隔,例如:user.logs.info

1.2.3 绑定键(Binding Key)

绑定键是消费者在绑定队列到交换机时指定的字符串,用于描述队列感兴趣的主题或类别。绑定键的格式与路由键相同,但支持通配符匹配。

1.2.4 通配符

Topic 模式支持两种通配符:

  • *(星号):匹配一个单词。
  • #(井号):匹配零个或多个单词。

例如:

  • *.logs.*:匹配所有包含 logs 的消息,如 user.logs.infosystem.logs.error
  • #.error:匹配所有以 error 结尾的消息,如 system.logs.erroruser.error

1.3 消息分发流程

  1. 生产者发送消息到 topic 类型的交换机,并指定路由键。
  2. 交换机根据路由键和队列的绑定键进行匹配。
  3. 如果匹配成功,消息会被分发到相应的队列。
  4. 消费者从队列中消费消息。

2. Topic 模式的 Java 代码实现

下面通过一个简单的 Java 代码示例,展示如何在 RabbitMQ 中实现 Topic 模式。

2.1 环境准备

在开始之前,请确保已经安装并运行了 RabbitMQ 服务,并且安装了 RabbitMQ 的 Java 客户端库。可以通过 Maven 引入依赖:

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

2.2 生产者代码

生产者负责发送消息到 topic 交换机,并指定路由键。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class TopicProducer {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 创建连接和通道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明一个 topic 类型的交换机channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 定义路由键和消息内容String routingKey = "user.logs.info"; // 可以修改为其他路由键String message = "This is a log message from user.";// 发送消息到交换机channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + routingKey + "': '" + message + "'");}}
}

2.3 消费者代码

消费者负责从队列中接收消息,并根据绑定键过滤感兴趣的消息。

import com.rabbitmq.client.*;public class TopicConsumer {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 创建连接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明一个 topic 类型的交换机channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 创建一个临时队列,并绑定到交换机String queueName = channel.queueDeclare().getQueue();String bindingKey = "user.#"; // 可以修改为其他绑定键channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");// 创建消费者并开始消费消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "': '" + message + "'");};channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });}
}

3. 运行示例

3.1 启动 RabbitMQ 服务

确保 RabbitMQ 服务已经启动并运行。如果使用 Docker,可以通过以下命令启动 RabbitMQ:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

3.2 运行生产者和消费者

  1. 运行 TopicProducer 类,发送消息到交换机。
  2. 运行 TopicConsumer 类,接收并处理消息。

3.3 测试不同的路由键和绑定键

  • 修改生产者的 routingKey,例如:system.logs.error
  • 修改消费者的 bindingKey,例如:#.error*.logs.*

观察消息的分发情况,验证 Topic 模式的通配符匹配功能。

在这里插入图片描述


4. 总结

RabbitMQ 的 Topic 模式通过通配符匹配的方式,提供了灵活的消息分发机制,适用于复杂的场景。通过本文的介绍和代码示例,读者可以深入理解 Topic 模式的工作原理,并掌握如何在 Java 中实现 Topic 模式。

在实际应用中,Topic 模式可以用于日志收集、事件驱动架构等场景,帮助开发者构建高效、可扩展的分布式系统。

相关文章:

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…...

tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录

目录 tslib的简介tslib的源码和make及make install后得到的文件下载tslib的主要功能tslib的工作原理tslib的核心组成部分tslib的框架和核心函数分析tslib的框架tslib的核心函数ts_setup()的分析(对如何获取设备名和数据处理流程的分析)函数ts_setup()自身的主要代码ts_setup()对…...

Ubuntu vi(vim)编辑器配置一键补全main函数

1.打开对应的配置文件 vi ~/.vim/snippets/c.snippets 2.按G将光标定位到文件末尾 3.按i进入插入模式 以tab键开头插入下的内容&#xff0c;空行也要加 tab键 4.:wq保存退出 5.再打开任意一个新的 .c文件后&#xff0c;插入模式输入 main 然后按tal键就能补全了...

验证码机制

偶然间看到了验证码机制&#xff0c;顺便总结一下&#xff1a; 首先&#xff0c;验证码是从后端生成的&#xff0c;随机生成&#xff1b; 【后端永远认为前端有可能会被伪造】 1.后端调用相关的绘图第三方类库&#xff0c;或是&#xff08;平台PHP、.NET、java&#xff09;系…...

【CVE-2024-56145】PHP 漏洞导致 Craft CMS 出现 RCE

大多数开发人员都同意,与 15 年前相比,PHP 是一种更加理智、更加安全和可靠的语言。PHP5早期的不良设计已让位于更好的开发生态系统,其中包括类、自动加载、更严格的类型、更理智的语法以及一大堆其他改进。安全性也没有被忽视。 register_globals一些老读者可能还记得和的…...

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…...

【网络安全】逆向工程 练习示例

1. 逆向工程简介 逆向工程 (RE) 是将某物分解以了解其功能的过程。在网络安全中&#xff0c;逆向工程用于分析应用程序&#xff08;二进制文件&#xff09;的运行方式。这可用于确定应用程序是否是恶意的或是否存在任何安全漏洞。 例如&#xff0c;网络安全分析师对攻击者分发…...

Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置

目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…...

相机内外参知识

已知相机的内外参数矩阵&#xff0c;可以求得相机在世界坐标系下的原点坐标。这里需要理解几个概念&#xff1a; 内参数矩阵&#xff08;Intrinsic Matrix&#xff09;: 描述相机本身的属性&#xff0c;比如焦距、主点位置等。外参数矩阵&#xff08;Extrinsic Matrix&#xf…...

从代币角度介绍solana账户体系

1、solana 的账户概念介绍 Solana的账户体系是其区块链的核心组成部分&#xff0c;它允许数据和价值在链上存储和转移。以下是Solana账户体系的一些关键特点&#xff1a; • 账户模型&#xff1a; • 在Solana上&#xff0c;所有数据都存储在所谓的“账户”中&#xff0c;类似…...

前端引入字体文件

1. 字体下载 阿里矢量图图标库地址 https://www.iconfont.cn/&#xff0c;页面打开后选中&#xff0c;素材库 > 字体库 左侧两个标签页可以切换&#xff0c;右侧放大镜图标可以搜索自己需要的字体 字体预览区域可以自行调整进行字体预览 右上角点击字体包下载&#xff0c;下…...

qemu启动后网络怎么设置?配合qemu-system-riscv64的命令设置

QEMU启动的时候&#xff0c;可以选择组网方式&#xff0c;一般有两种选择&#xff0c;user模式和tap模式 user模式就是用NAT&#xff0c;tap模式就是用bridge网桥模式。以前也有过一次实践&#xff1a;FreeBSD RISCV 在QEME中实践-网络配置_pkg.txz: not found-CSDN博客 user…...

如何测量分辨率

一、什么是分辨率&#xff1f; 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率&#xff0c;但是相机在在不同的对比度的情况下还原低&#xff0c;中和高频率的能力&#xff0c;也可以显示全面综合的信息。…...

汇总贴:cocos creator

1 cocoscreator-doc-TS:目录-CSDN博客 访问节点和组件 常用节点和组件接口 创建和销毁节点 加载和切换场景 获取和设置资源 监听和发射事件 节点系统事件 缓动系统&#xff08;cc.tween&#xff09; 使用计时器 使用对象池 使用 TypeScript 脚本 模块化脚本 脚本执行顺序 全局…...

[N1CTF 2018]eating_cms

[N1CTF 2018]eating_cms 知识点 文件上传 解题 这个题感觉还好&#xff0c;知识点真心不难&#xff0c;就是全混在一起。 思路差不多挺离谱 首先看到&#xff0c;有一个登录界面&#xff0c;然后猜测有注册界面 admin注册不了&#xff0c;随便注册一个账号。 注册之后&…...

重拾设计模式--建造者模式

文章目录 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML图作用&#xff1a;建造者模式的结构产品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具体建造者&#xff08;Concrete Builder&#xff…...

【机器学习】以机器学习为翼,翱翔网络安全创新苍穹

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在数字化浪潮汹涌澎湃的当下&#xff0c;网络安全如同守护数字世界的坚固堡垒&#xff0c;其重要性不言而喻。而机器学习技术的蓬勃…...

人工智能在VR展览中扮演什么角色?

人工智能&#xff08;AI&#xff09;在VR展览中扮演着多重关键角色&#xff0c;这些角色不仅增强了用户体验&#xff0c;还为展览的组织者提供了强大的工具。 接下来&#xff0c;由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用&#xff1a; 个性…...

mysql,创建数据库和用户授权核心语句

一.库操作1.创建库create database if not exists 库名 default 字符集 default 校对规则2.删除库drop database if exists 库名3.修改库的,字符集,校对规则alter databse 库名 default 字符集 default 校对规则4.查看当前使用的库seclect databse();5.查看库show databases;…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...