news 2026/6/10 14:28:00

Java开发中的消息通讯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java开发中的消息通讯

在java开发中,要实现事件驱动,即当发生按特定事件时,通知关联方以便作出改变,有三种方案:

一、分析对比

1、观察者模式;

2、Redis 订阅机制;

3、专业版 MQ。

下面逐一进行介绍并总结其各自的适用场景。

1. Java 观察者模式(Observer Pattern)

这是设计模式层面的一种行为型模式,核心是实现「一对多」的对象依赖关系:当一个对象(被观察者 / Subject)状态发生变化时,所有依赖它的对象(观察者 / Observer)会被自动通知并更新。

核心特点:
  • 内存内同步通信:观察者和被观察者都运行在同一个 JVM 进程内,通知是同步的(被观察者通知完所有观察者后,自身方法才会返回)。
  • 耦合度低:基于接口编程(Subject/Observer 接口),观察者和被观察者只需依赖接口,无需知道对方具体实现。
  • 无持久化 / 重试:通知过程仅在内存中完成,若观察者处理失败,被观察者不会重试,也无消息持久化能力。

简单代码示例:

import java.util.Observable; import java.util.Observer; // 被观察者:发布消息的对象 class MessageSubject extends Observable { public void publishMessage(String msg) { // 标记状态变化 setChanged(); // 通知所有观察者 notifyObservers(msg); } } // 观察者1:接收并处理消息 class MessageObserver1 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("观察者1收到消息:" + arg); } } // 观察者2:接收并处理消息 class MessageObserver2 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("观察者2收到消息:" + arg); } } // 测试 public class ObserverDemo { public static void main(String[] args) { MessageSubject subject = new MessageSubject(); // 注册观察者 subject.addObserver(new MessageObserver1()); subject.addObserver(new MessageObserver2()); // 发布消息 subject.publishMessage("Hello 观察者模式"); } }

输出

观察者2收到消息:Hello 观察者模式

观察者1收到消息:Hello 观察者模式

从中可以看出消息的处理顺序是随机的。

2. Redis 订阅 / 发布机制(Pub/Sub)

Redis 提供的轻量级消息通信机制,核心是「频道(Channel)」:发布者向指定频道发送消息,所有订阅该频道的客户端都会收到消息。

核心特点:
  • 跨进程 / 跨机器通信:基于 Redis 服务端中转,支持不同进程、不同机器的客户端通信。
  • 无持久化 / 无确认机制:消息发送后若没有订阅者,消息直接丢失;Redis 不会记录消息,也不保证订阅者一定收到(如客户端断连)。
  • 轻量简单:无需复杂配置,适合低可靠性要求的场景(如实时通知、状态同步)。

简单使用示例(Redis CLI):

# 终端1:订阅频道 "news" redis-cli SUBSCRIBE news # 终端2:向频道 "news" 发布消息 redis-cli PUBLISH news "Redis 发布订阅测试" # 终端1 会收到: # "message" # "news" # "Redis 发布订阅测试"
3. 专业版 MQ(以 RabbitMQ 为例)

RabbitMQ 是基于 AMQP 协议的重量级消息中间件,核心是「消息队列」:消息由生产者发送到队列,消费者从队列获取消息,中间件提供完善的消息管控能力。

核心特点:
  • 高可靠性:支持消息持久化(磁盘存储)、消息确认(ACK)、重试机制,确保消息不丢失。
  • 异步解耦:生产者发送消息后无需等待消费者处理,中间件缓存消息,消费者按需消费。
  • 丰富的路由策略:支持交换机(Direct/Fanout/Topic)、队列绑定,可实现复杂的消息路由(如按规则分发给不同消费者)。
  • 集群 / 高可用:支持集群部署,避免单点故障,适合高并发、高可靠性要求的生产环境。
简单代码示例(Java + RabbitMQ):
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback; public class RabbitMQDemo { private static final String QUEUE_NAME = "test_queue"; // 生产者:发送消息 public static void sendMessage() throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); // Redis 服务地址 try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { // 声明队列(持久化) channel.queueDeclare(QUEUE_NAME, true, false, false, null); String message = "RabbitMQ 测试消息"; // 发送消息 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("生产者发送消息:" + message); } } // 消费者:接收消息 public static void receiveMessage() throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, true, false, false, null); System.out.println("消费者等待接收消息..."); // 消息回调处理 DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); System.out.println("消费者收到消息:" + message); // 手动确认消息已处理(确保不重复消费) channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); }; // 消费消息(关闭自动确认) channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {}); } public static void main(String[] args) throws Exception { // 启动生产者 sendMessage(); // 启动消费者 receiveMessage(); } }

二、三者核心对比

维度Java 观察者模式Redis 订阅 / 发布RabbitMQ(专业 MQ)
通信范围单 JVM 进程内跨进程 / 跨机器跨进程 / 跨机器
可靠性无重试 / 无持久化无重试 / 无持久化有重试 / 有持久化 / ACK
耦合度低(接口解耦)极低(Redis 中转)极低(队列解耦)
性能极高(内存通信)高(Redis 轻量)中(功能复杂)
适用场景单进程内状态通知轻量实时通知、低可靠高并发、高可靠业务场景
核心定位设计模式(代码层面)轻量消息工具企业级消息中间件

三、总结

  1. Java 观察者模式是「代码层面」的解耦方案,仅适用于单进程内的消息通知,无跨进程能力;
  2. Redis 订阅机制是「轻量跨进程」的消息工具,适合低可靠性要求的实时通知,不适合核心业务;
  3. RabbitMQ 等专业 MQ是「企业级」的消息中间件,提供完善的可靠性保障,是核心业务异步解耦、削峰填谷的首选。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:11:16

电子世界的奇妙冒险:01-2. 调试与工程专题:问题总是藏在某个忽视的角落

01-2 调试与工程专题:问题总是藏在某个忽视的角落 专题一:调试与工程篇——电阻不听话时,我们怎么办? 欢迎继续我们的电子冒险!上两期我们从一个孤零零的电阻出发,认识了它、给它找了朋友(电源、LED),还亲手焊了一个会亮的小电路。现在,冒险进入新阶段:现实世界里…

作者头像 李华
网站建设 2026/6/10 13:12:50

【期货量化入门】期货量化交易策略新手入门问答(Python量化)

一、前言 对于量化交易新手,会有很多基础问题。本文整理了新手最关心的50个问题,从最基础的"什么是量化交易"到"如何开始第一个策略",帮助新手快速入门。 本文将解答: 基础概念问题环境搭建问题第一个策略…

作者头像 李华
网站建设 2026/5/21 17:48:05

三菱MR-JE-C伺服电机FB功能块在Q系列PLC流水线项目中的应用

三菱MR-JE-C伺服电机FB功能块(适用Q系列PLC) 流水线项目,16个MR-JE-C电机,为了加快编程速度,特意做的一个FB功能块,内部采用局部变量全局缓冲区的方式进行编程,多次调用不冲突! 适用于Q系列PLC和MR-JE-C的运动控制。 F…

作者头像 李华
网站建设 2026/6/10 13:49:54

大模型RAG工程化实践:规则检索器实现与演进思路

文章介绍了RAG工程化中的规则检索实现,从V1到V2的演进过程。规则检索具有可解释、可控、上线快等优势,适合企业内部知识库。通过代码示例展示了如何构建可运行、可解释、可迭代的规则检索系统,包括查询降噪、多层规则筛选、打分排序和命中规则…

作者头像 李华
网站建设 2026/5/29 6:38:33

人大重磅综述:LLM自主智能体全面爆发!

从AutoGPT的横空出世到斯坦福“西部世界”的惊艳亮相,自主智能体(Autonomous Agents)正以惊人的速度重塑我们对AI的认知。如果说ChatGPT只是一个博学的“大脑”,那么Agent就是给这个大脑装上了手脚和感官,让它真正具备…

作者头像 李华