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

关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结

以下是关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结:


一、异步消息核心概念与JMS模式对比

1. 异步消息核心组件
组件作用
生产者发送消息到消息代理(如RabbitMQ、Kafka)。
消息代理中间件(如RabbitMQ、Kafka),负责消息存储、路由和分发。
消费者接收并处理消息。
队列/主题消息的容器,队列用于P2P,主题用于Pub/Sub。
消息需要传输的数据单元,可包含文本、JSON、二进制等。

2. JMS的两种消息模式
模式点对点(P2P)发布/订阅(Pub/Sub)
消息容器队列(Queue)主题(Topic)
消息处理每条消息被一个消费者处理每条消息被所有订阅者接收
消息存活消息被消费后从队列中删除消息存活时间短(通常由代理配置)
消费者角色消费者竞争消费消息消费者订阅主题,独立接收消息
适用场景任务分配(如订单处理)实时通知(如股票价格更新)

3. 常用消息队列对比

组件类型协议适用场景特点
ActiveMQJMS兼容OpenWire传统企业级应用开源、支持P2P和Pub/Sub,但性能较RabbitMQ低。
RabbitMQAMQPAMQP复杂路由需求(如死信队列)支持多种协议、插件丰富、轻量级、适合中小型系统。
Kafka分布式流处理Kafka Protocol高吞吐场景(如日志收集)高吞吐、持久化、支持水平扩展,但配置复杂。

二、Spring Boot集成RabbitMQ示例

1. 依赖配置
<!-- pom.xml -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置文件(application.yml)
spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
3. 生产者服务
@Service
public class MessageProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;// 发送到队列(P2P)public void sendToQueue(String message) {rabbitTemplate.convertAndSend("order.queue", message);}// 发送到主题(Pub/Sub)public void sendToTopic(String message) {rabbitTemplate.convertAndSend("stock.topic", "stock.routing.key", message);}
}
4. 消费者服务
@Component
public class MessageConsumer {// 接收队列消息@RabbitListener(queues = "order.queue")public void handleOrderMessage(String message) {System.out.println("Received order message: " + message);}// 接收主题消息@RabbitListener(bindings = @QueueBinding(value = @Queue,exchange = @Exchange(name = "stock.topic", type = "topic"),key = "stock.routing.key"))public void handleStockMessage(String message) {System.out.println("Received stock update: " + message);}
}
5. 控制器示例
@RestController
public class MessageController {@Autowiredprivate MessageProducer producer;@PostMapping("/send/order")public String sendOrderMessage(@RequestParam String message) {producer.sendToQueue(message);return "Message sent to order queue";}@PostMapping("/send/stock")public String sendStockMessage(@RequestParam String message) {producer.sendToTopic(message);return "Message sent to stock topic";}
}

三、Spring Cloud集成Kafka示例

1. 依赖配置
<!-- pom.xml -->
<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>
</dependency>
2. 配置文件(application.yml)
spring:kafka:bootstrap-servers: localhost:9092producer:key-serializer: org.apache.kafka.common.serialization.StringSerializervalue-serializer: org.apache.kafka.common.serialization.StringSerializerconsumer:group-id: my-groupauto-offset-reset: earliestkey-deserializer: org.apache.kafka.common.serialization.StringDeserializervalue-deserializer: org.apache.kafka.common.serialization.StringDeserializer
3. 生产者服务
@Service
public class KafkaProducer {@Autowiredprivate KafkaTemplate<String, String> kafkaTemplate;public void send(String topic, String message) {kafkaTemplate.send(topic, message);}
}
4. 消费者服务
@Component
public class KafkaConsumer {@KafkaListener(topics = "my-topic")public void listen(String message) {System.out.println("Received message: " + message);}
}
5. 控制器示例
@RestController
public class KafkaController {@Autowiredprivate KafkaProducer producer;@PostMapping("/send/kafka")public String sendMessage(@RequestParam String message) {producer.send("my-topic", message);return "Message sent to Kafka topic";}
}

四、总结与选择建议

场景推荐组件原因
复杂路由需求RabbitMQ支持AMQP协议,插件丰富,适合死信队列、延迟队列等高级功能。
高吞吐/大数据量Kafka毫秒级延迟、水平扩展能力强,适合日志收集、流处理。
传统企业级应用ActiveMQ兼容JMS规范,适合遗留系统集成。

关键代码总结

  1. RabbitMQ核心注解

    • @RabbitListener:标注消费者方法。
    • RabbitTemplate:发送消息的核心类。
  2. Kafka核心注解

    • @KafkaListener:标注消费者方法。
    • KafkaTemplate:发送消息的核心类。
  3. Spring配置

    • 通过application.yml配置连接信息。
    • 使用@EnableRabbit(RabbitMQ)或@EnableKafka(Kafka)启用支持。

注意事项

  • 消息可靠性:确保消息持久化、消费者确认机制(ACK)。
  • 性能优化:合理设置线程池、批量发送消息。
  • 监控与告警:集成Prometheus/Grafana监控队列状态。

通过上述配置和代码示例,可以快速实现Spring Boot应用中的异步消息处理,提升系统解耦和扩展性。

相关文章:

关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结

以下是关于异步消息队列的详细解析&#xff0c;涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结&#xff1a; 一、异步消息核心概念与JMS模式对比 1. 异步消息核心组件 组件作用生产者发送消息到消息代理&#xff08;如RabbitMQ、Kafka&#xff09;。消息代理中间…...

利用 Python 进行股票数据可视化分析

在金融市场中&#xff0c;股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化&#xff0c;我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言&#xff0c;拥有丰富的数据处理和可视化库&#xf…...

【Docker】离线安装Docker

背景 离线安装Docker的必要性&#xff0c;第一&#xff0c;在目前数据安全升级的情况下&#xff0c;很多外网已经基本不好访问了。第二&#xff0c;如果公司有对外部署的需求&#xff0c;那么难免会存在对方只有内网的情况&#xff0c;那么我们就要做到学会离线安装。 下载安…...

kubectl命令补全以及oc命令补全

kubectl命令补全 1.安装bash-completion 如果你用的是Bash(默认情况下是)&#xff0c;先安装补全功能支持包 sudo apt update sudo apt install bash-completion -y2.为kubectl 启用补全功能 会话中临时&#xff1a; source <(kubectl completion bash)持久化配置&#x…...

《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势

一、前言 在现代软件开发中&#xff0c;“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中&#xff0c;“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时&#xff0c;希望允许用户自定义排序规则&a…...

极简cnn-based手写数字识别程序

1.先看看识别效果&#xff1a; 这个程序识别的是0~9的一组手写数字&#xff0c;这是最终的识别效果&#xff0c;为1&#xff0c;代表识别成功&#xff0c;0为失败。 然后数据源是&#xff1a;ds deeplake.load(hub://activeloop/optical-handwritten-digits-train)里面是一组…...

C++核心机制-this 指针传递与内存布局分析

示例代码 #include<iostream> using namespace std;class A { public:int a;A() {printf("A:A()的this指针&#xff1a;%p!\n", this);}void funcA() {printf("A:funcA()的this指针&#xff1a;%p!\n", this);} };class B { public:int b;B() {prin…...

vue3 history路由模式刷新页面报错问题解决

在使用history路由模式时刷新网页提示404错误&#xff0c;这是改怎么办呢。 官方解决办法 https://router.vuejs.org/zh/guide/essentials/history-mode.html...

PHP爬虫教程:使用cURL和Simple HTML DOM Parser

一个关于如何使用PHP的cURL和HTML解析器来创建爬虫的教程&#xff0c;特别是处理代理信息的部分。首先&#xff0c;我需要确定用户的需求是什么。可能他们想从某个网站抓取数据&#xff0c;但遇到了反爬措施&#xff0c;需要使用代理来避免被封IP。不过用户没有提到具体的目标网…...

Web前端开发——格式化文本与段落(上)

一、学习目标 网页内容的排版包括文本格式化、段落格式化和整个页面的格式化&#xff0c;这是设计个网页的基础。文本格式化标记分为字体标记、文字修饰标记。字体标记和文字修饰标记包括对于字体样式的一些特殊修改。段落格式化标记分为段落标记、换行记、水平分隔线标记等。…...

技术方案选型要考虑哪些点?

在概要设计阶段&#xff0c;技术方案选型是核心环节之一&#xff0c;需综合考虑系统需求、技术可行性、团队能力及长期维护成本。以下是技术方案选型需包含的核心内容及设计要点&#xff0c;结合行业实践和搜索结果中的方法论&#xff1a; 理论 一、系统架构选型 整体架构模式…...

前端工程化之自动化构建

自动化构建 自动化构建的基本知识历史云构建 和 自动化构建 的区别&#xff1a;部署环境&#xff1a;构建&#xff1a;构建产物构建和打包的性能优化页面加载优化构建速度优化 DevOps原则反馈的技术实践 encode-bundlepackage.json解读src/cli-default.tssrc/cli-node.tssrc/cl…...

3.2.2.1 Spring Boot配置静态资源映射

在Spring Boot中配置静态资源映射&#xff0c;可以通过默认路径或自定义配置实现。默认情况下&#xff0c;Spring Boot会在classpath:/static/等目录下查找静态资源。若需自定义映射&#xff0c;可通过实现WebMvcConfigurer接口的addResourceHandlers方法或在全局配置文件中设置…...

# 更换手机热点后secureCRT无法连接centOS7系统

更换手机热点后secureCRT无法连接centOS7系统 一、问题描述 某些情况下&#xff0c;我们可能使用手机共享热点而给电脑联网。本来用一个手机热点共享网络时&#xff0c;SecureCRT可以正常连接到CentOS 7虚拟机&#xff0c;当更换一个手机热点时&#xff0c;突然发现SecureCR…...

【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践

一、引言​ 在前两篇 Redis 消息队列的文章中&#xff0c;我们掌握了基础使用和高级特性。本文作为系列终篇&#xff0c;将聚焦生产环境的性能优化与全流程实践&#xff0c;请各位跟随小编的步伐一起构建高可靠、高性能的消息处理系统&#xff08;文章中的演示均为Centos7的背…...

jupyter notebook 无法启动- markupsafe导致

一、运行jupyter notebook和Spyder报错&#xff1a;(已安装了Anaconda&#xff0c;以前可打开) 1.背景&#xff1a;为了部署机器学习模型&#xff0c;按教程直接安装了flask 和markupsafe&#xff0c;导致jupyter notebook&#xff0c;Spyder 打不开。 pip install flas…...

Kotlin作用域函数

在 Kotlin 中&#xff0c;.apply 是一个 作用域函数&#xff08;Scope Function&#xff09;&#xff0c;它允许你在一个对象的上下文中执行代码块&#xff0c;并返回该对象本身。它的设计目的是为了 对象初始化 或 链式调用 时保持代码的简洁性和可读性。 // 不使用 apply va…...

设计模式:工厂方法模式 - 高扩展性与低耦合的设计之道

一、为什么需要工厂方法模式&#xff1f; 在软件开发中&#xff0c;对象创建与使用耦合会影响系统的灵活性和扩展性。以通知系统&#xff08;支持邮件通知、短信通知和推送通知&#xff09;为例 &#xff1a;直接实例化。 Notification email new EmailNotification(); Noti…...

CTF web入门之命令执行 完整版

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…...

自然语言处理spaCy

spaCy 是一个流行的开源 自然语言处理&#xff08;NLP&#xff09; 库&#xff0c;专注于 高效、易用和工业化应用。它由 Explosion AI 开发&#xff0c;广泛应用于文本处理、信息提取、机器翻译等领域。 zh_core_web_sm 是 spaCy 提供的一个小型中文预训练语言模型&#xff0…...

在spark中,窄依赖算子map和filter会组合为一个stage,这种情况下,map和filter是在一个task内进行的吗?

在 Spark 中&#xff0c;当 map 和 filter 这类窄依赖&#xff08;Narrow Dependency&#xff09;的算子连续应用时&#xff0c;它们会被合并到同一个 Stage 中&#xff0c;并且在同一个 Task 内按顺序执行。这种优化称为 流水线&#xff08;Pipeline&#xff09;执行&#xff…...

MySQL切换PolarDB-X方案

一、DTS 增量同步完成后的流量切换策略 1. 切换期间的数据写入处理 • 场景&#xff1a;DTS 增量同步完成&#xff08;Lag0&#xff09;后&#xff0c;业务流量切换到 PolarDB-X 的瞬间可能产生 2-3 秒延迟&#xff0c;导致部分订单仍写入 MySQL。 • 解决方案&#xff1a; ◦…...

Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路

Java 开发工具&#xff1a;从 Eclipse 到 IntelliJ IDEA 的进化之路 在 Java 开发的历史长河中&#xff0c;开发工具的演变不仅改变了程序员的编码方式&#xff0c;也深刻影响了整个行业的开发效率和代码质量。从 Eclipse 到 IntelliJ IDEA&#xff0c;这不仅是工具的更替&…...

GPT - 2 文本生成任务全流程

数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...

红宝书第四十三讲:基于资料的数据可视化工具简单介绍:D3.js 与 Canvas绘图

红宝书第四十三讲&#xff1a;基于资料的数据可视化工具简单介绍&#xff1a;D3.js 与 Canvas绘图12 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、D3.js&#xff1a;数据驱动文档的王者 1 核心特性&#x…...

UI基础(1)

quit和close的区别: driver.close():关闭当前正在使用的窗口。 1、如果你的当前浏览器窗口只有一个情况下,它就会关闭窗口并且关闭浏览器 2、如果你的当前浏览器窗口有多个的情况下,它就会关闭driver驱动焦点所在的窗口 driver.quit():真正关闭浏览器(把所有的窗口都关闭…...

深入理解 Vue 的数据代理机制

何为数据代理&#xff1f; 通过一个对象代理对另一个对象中的属性的操作&#xff08;读/写&#xff09;&#xff0c;就是数据代理。 要搞懂Vue数据代理这个概念&#xff0c;那我们就要从Object.defineProperty()入手 Object.defineProperty()是Vue中比较底层的一个方法&…...

封装,继承,多态(续)

在Java中&#xff0c;最基础的三原则无疑是封装&#xff0c;继承&#xff0c;多态 对于这三类&#xff0c;最基本同样最重要&#xff0c;我们是会经常遇到的&#xff0c;在编程中&#xff0c;会使用&#xff0c;但在考试中还有一定的不理解。 对于这点&#xff0c;我在这里进…...

Java excel导入/导出导致内存溢出问题,以及解决方案

excel导入/导出导致内存溢出问题&#xff0c;以及解决方案 1、内存溢出问题导入功能重新修正&#xff0c;采用SAX的流式解析数据。并结合业务流程。导出功能&#xff1a;由于精细化了业务流程&#xff0c;导致比较代码比较冗杂&#xff0c;就只放出最简单的案例。 1、内存溢出问…...

10 个最新 CSS 功能已在所有主流浏览器中得到支持

前言 CSS 不断发展&#xff0c;新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进&#xff08;Baseline 2024&#xff09;&#xff0c;许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…...