08 消息与事件工具
消息系统把调用方与处理方在时间和容量上解耦,也把确认、重试、顺序、重复、堆积和数据保留带进系统边界。Broker 能启动、控制台能打开、生产者返回成功,都不足以证明消息链路可靠;消费确认、失败重投、积压诊断和恢复清理必须一起验证。
从消息语义选择工具
| 工具 | 更擅长的场景 | 架构判断 |
|---|---|---|
| RabbitMQ | 复杂路由、工作队列、低延迟业务消息 | exchange/binding、ack、DLX、quorum queue、vhost 权限 |
| Kafka | 高吞吐事件流、日志、可重放消费 | partition、consumer group、offset、retention、KRaft 与副本 |
| Kafka UI 与 AKHQ | Kafka 多集群观察、消息排障和受控管理入口 | listener、SASL/SSL、Schema Registry、UI RBAC、Kafka ACL 与数据遮罩 |
| RocketMQ | 业务消息、顺序、延迟和事务消息生态 | NameServer、Broker、Proxy、消费组、存储与主从路线 |
| RocketMQ Dashboard | RocketMQ 路由、消费进度、消息轨迹和受控操作入口 | NameServer/Broker 可达性、ACL、角色路径、版本兼容与变更审计 |
| Pulsar | 多租户消息、队列与流统一、存算分离 | tenant/namespace、subscription、BookKeeper 与分层存储 |
| NATS | 轻量 pub/sub、request/reply 与边缘通信 | Core NATS 的易失语义、JetStream 持久化和 subject 治理 |
| ActiveMQ Classic | 既有 JMS 系统和传统企业集成 | Classic 与 Artemis 边界、KahaDB、DLQ 和迁移成本 |
工具之间没有按规模从小到大的单一排序。选择之前先确定:消息是否需要重放,单条消息是否必须持久化,消费者失败后怎样重试,顺序保证落在哪个分区或队列,积压时允许丢弃还是必须扩容,以及团队能否维护对应集群。
控制台是观察与操作入口,不是新的消息权限系统。Kafka UI、AKHQ 和 RocketMQ Dashboard 都应使用独立服务身份,默认只读,并让 Broker 端权限继续兜底;关闭控制台不能影响任何生产者和消费者。
一条可信的消息链路
正向实验要证明消息内容、路由和确认正确;反向实验要稳定制造认证拒绝、错误地址、消费者失败或积压,并能从日志、管理 API、消费位点和死信资源中找到证据。只看 healthy 或端口监听不是验收结果。
架构师需要统一的语义
- 投递语义:at-most-once、at-least-once 和 exactly-once 各自约束生产者、Broker 与消费者,不能靠产品名称自动获得。
- 幂等边界:消息 ID、业务唯一键、去重窗口和状态落库由业务系统负责,Broker 重试不会替代幂等设计。
- 顺序边界:全局顺序通常代价高,工程上应收敛到同一 queue、partition、message group 或 subject 序列。
- 积压边界:消息数只是表象,还要观察生产消费速率、未确认数量、consumer lag、backlog、磁盘和最老消息年龄。
- 保留边界:队列过期、topic retention、stream limits 和 DLQ 保留必须与故障恢复时间一致。
- 回放边界:重置 offset、重新订阅或移动死信前先冻结写入范围,记录起点和 owner,并准备停止条件。
共同故障面
- 宿主、容器和集群内部使用不同地址,
advertised listener、NameServer、Proxy 或 service URL 返回客户端不可达地址。 - 旧 volume 保留队列、topic、consumer group、subscription、offset、ACL 或存储元数据,使新配置看似没有生效。
- 自动确认发生在业务提交之前,消费者异常时消息已经不可恢复;反过来,确认太晚又会制造重复投递。
- 控制台使用管理员身份,purge、delete、reset offset、truncate 和改 retention 没有爆炸半径限制。
- 开发环境没有容量和过期策略,积压、日志和段文件共同填满磁盘,Broker 开始阻塞生产者。
- broker URL、JAAS、token、cookie、TLS key 或云 AccessKey 进入仓库、截图和终端历史。
学习顺序
先选择一种与当前业务最接近的工具,完成单节点生产、消费、确认、失败重投、积压观察和清理。随后再进入多节点拓扑,验证节点故障、分区或副本恢复、客户端重连和权限收敛。跨产品比较时以消息语义、恢复能力、容量证据和团队维护成本为准,不以控制台界面或一次吞吐测试下结论。
