本文作者:古崟佑,阿里云中间件开发。
RocketMQ 5.0 版本拥有非常多新特性,比如存储计算分离、 batch 能力的提升等,它是具有里程碑意义的版本。
提到新版本,我们往往会首先想到服务端架构的设计变动,很容易忽略客户端的设计理念。客户端也是消息产品的必要组成部分,许多特性需要 client 与 server 两端互相协作,才能更好地实现。
轻量化、云原生以及统一模型是 RocketMQ 5.0 客户端的三个设计理念。
01 轻量化
轻量化的重点在于轻逻辑、轻流程,化繁为简,减少多语言生态发展的阻碍。
上图列举了 RocketMQ 4.x 版本和 RocketMQ 5.0 版本的差异。
①4.x 版本的序列化使用 JsonCodecs 和 RocketMQCodecs,5.0 版本使用的则是标准的 Protobuf 协议。多语言发展的阻碍包括许多不规范,比如 RocketMQ 自定义序列化对于其他的语言需要自己实现一套协议以实现正反序列化解析。而 Json 作为标准序列化协议,基本可以实现所有语言的正反序列化,但缺点也非常明显,冗余信息过多,体积占用太大,因此更多用于 restful 架构等前后端交互的场景。此外,消息中间件场景无需关心传输数据时是否可读。因此, Protobuf 成为了选择,它原生支持多语言,且传输时体积占用非常小,成熟且标准。
②此前客户端使用 consumer 消费信息时,会存在计算逻辑比如重平衡 以及系统级 topic 处理。但是 RocketMQ 5.0 版本将所有计算逻辑上移到了服务端,客户端只需简单地调用 Receive 接口,也无需额外处理系统级 topic ,整体逻辑变得非常轻量。
③4.x版本的实现和维护成本非常高,因此5.0版本并没有基于4.x进行迭代和更新。设计之初有一种思路为直接在4.x客户端上增加 gRPC 协议,迭代升级成为5