Java开发中的消息通讯

📅 发布时间:2026/7/7 12:22:49 👁️ 浏览次数:
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/SubRedis 提供的轻量级消息通信机制核心是「频道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 RabbitMQimport 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 轻量中功能复杂适用场景单进程内状态通知轻量实时通知、低可靠高并发、高可靠业务场景核心定位设计模式代码层面轻量消息工具企业级消息中间件三、总结Java 观察者模式是「代码层面」的解耦方案仅适用于单进程内的消息通知无跨进程能力Redis 订阅机制是「轻量跨进程」的消息工具适合低可靠性要求的实时通知不适合核心业务RabbitMQ 等专业 MQ是「企业级」的消息中间件提供完善的可靠性保障是核心业务异步解耦、削峰填谷的首选。