“Kafka永远是最优解。”“RabbitMQ早就过时了。”“NATS快到没朋友。”“别折腾了,直接Redis。”——这些年在后端讨论区里,这类口号式的断言我见得太多了。可一旦你追问一句“为什么”,抛出断言的哥们往往就开始顾左右而言他。上周我整理工作流引擎的文章时,评论区又冒出这种味道的争论,于是干脆把2026年市面上几个主流消息代理的底裤扒一遍,用一次不带滤镜的清单式拆解,把那些似是而非的说法挨个晾一晾。
先对齐一下“消息代理”这玩意儿到底是干嘛的。你有一个订单服务,本来要直接调用payment_service.process_order(order),现在改成一个发布动作:broker.publish("order.created", order)。另一个服务监听到这条消息后自己去处理。这一刀切下去,系统就多了几样好处:伸缩起来更方便、组件间耦合度肉眼可见地下降、后台任务能独立排队、异常重试也不用把主流程拖死。微服务、通知、支付流水、事件驱动、实时推送——但凡沾点“解耦”和“异步”的边,消息代理都是绕不开的组件。但选哪个,真不是拍脑袋能定的。
第一棒,Kafka。你肯定听过,LinkedIn、Uber、Netflix的核心管道都有它的身影。Kafka的设计思路很直白:消息写进主题后不会消费即焚,而是按时间窗口老老实实趴在那儿。这就带来了三个能改变架构认知的特性:一是消费者随时可以回溯,哪怕昨晚的订单流想重推一次,只要消息还没过期就能重放;二是同一个消息能被多个业务方分别消费,各自维护自己的偏移量互不干扰;三是它能把消息流当成系统的事实来源,想审计、想回补数据、想重建状态,都有一份历史账本在那儿撑着。配合分区和消费者组的并行设计,它在高吞吐场景下的确能把一些更传统的代理甩开一截。
但你要是一上来就把Kafka塞进一个只有三个服务的创业项目里,那感觉大概就跟你用挖掘机挖花盆一样——不是挖不动,而是整套运维的成本会让你怀疑人生。它的学习曲线摆在那儿,集群部署、分区规划、偏移量管理、整理策略,每一项都值得单独写本手册。所以别看见大厂用就跟着喊“Kafka永远正确”,人家是日均万亿级消息的量,你的业务体量可能连人家零点一个分区都撑不满。
第二棒,RabbitMQ。这玩意儿经常被那帮执着于“潮流”的人打上“老旧”的标签,可你翻翻那些真正跑钱的系统——支付结算、订单履约、通知分发——里面扎扎实实扛着生产流量的一大批,还是这个老伙计。RabbitMQ把消息塞进队列,消费者读走、处理、确认,这条路径清晰得像验钞机的传送带。它内置的重试机制、死信队列、延迟消息、优先级队列,以及五花八门的路由策略,在业务系统里几乎是不用额外造轮子的积木。对于一个需要精细控制消息生命周期的团队来说,RabbitMQ的成熟度本身就是一种不可替代的生产力。
但你要是想用它做全局的事件溯源,或者让一个消息被上千个消费者同时消费,它就会开始气喘。它的消息重放能力天生不如Kafka那样原生,大部分实现要么依赖额外的插件,要么需要手动设计回放路径。所以它真正的舒适区不在于“海量数据管道”,而在于“可靠的任务分发”。下次再听见有人说“RabbitMQ已死”,你可以反问一句:你们公司那套跑着千万级日订单的支付流转,敢全量切到某个刚发布两年的新引擎上吗?
第三棒,NATS。如果说Kafka是重型卡车,RabbitMQ是皮实耐造的商务车,那NATS大概就是电单车里的赛博款——极致轻量,启动快到让你怀疑它是不是跳过了什么必要的初始化。云原生圈子喜欢它不是没道理的,它的发布/订阅模式几乎零配置,服务上线后往集群里一接,Topic一订阅,消息立马就飞起来。那种“叮”一下就从生产端直达消费端的爽感,对服务网格、边车通信这类场景来说,简直像量身定做。
缺点同样鲜明。轻量往往意味着取舍,你在传统消息代理里习以为常的高级
热门跟贴