发布订阅模式支持一发多收,点对点模式保证一发一收;前者用topic使所有订阅者各收一份,后者用queue确保消息仅被一个消费者处理。

发布订阅模式和点对点模式的核心区别在于一条消息能否被多个消费者处理。前者支持“一发多收”,后者保证“一发一收”。
消息消费范围不同
点对点模式使用 Queue,消息一旦被某个消费者取走并确认消费,就会从队列中删除,其他消费者无法再获取这条消息。即使有十个消费者监听同一个 Queue,也只有一个人能处理它。
发布订阅模式使用 Topic,生产者发一条消息到 Topic,所有当前已订阅该 Topic 的消费者都会各自收到一份完整拷贝。比如用户注册事件同时通知短信服务、邮件服务、积分服务,三者互不干扰。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
角色与依赖关系不同
点对点模式中,生产者和消费者之间没有直接绑定关系。生产者只管往 Queue 发,Queue 负责暂存;消费者随时可上线拉取消息,无需提前声明。
发布订阅模式中,消费者必须先完成订阅动作(尤其是持久订阅),才能接收后续消息。临时订阅的消费者下线后,未消费的消息可能丢失;持久订阅则会为它保留消息,直到它重新上线拉取。
适用场景差异明显
- 选点对点:任务分发类场景,比如订单校验、图片压缩、支付回调处理——每个任务只需一个服务执行,避免重复计算。
- 选发布订阅:事件广播类场景,比如用户行为日志同步、配置变更通知、多系统状态更新——需要多个下游系统同时响应同一事件。
主流实现的支持方式
RabbitMQ 通过 Exchange + Binding 实现两种语义:用 direct 或 queue 绑定模拟点对点;用 topic 或 fanout Exchange 实现发布订阅。Kafka 原生以 Topic 为基础,但通过消费者组(Consumer Group)机制,在组内实现点对点语义(组内只有一人消费),组间实现发布订阅(不同组都可全量消费)。RocketMQ 同样用 Topic + 消费者组区分集群消费(组内点对点)和广播消费(组内每人都收)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










