“赵鸣的语义聚类模块用的是Protobuf做数据序列化,这是他在医疗影像那边用惯了的协议,优点是压缩率高、解析速度快。”
“但何博士的Kafka消息中间件用的是Avro,因为Kafka对Avro有原生支持,异步回调的延迟能做到最低。单模块各自跑各自的序列化协议没问题,可一旦跨模块通信,Protobuf的消息到了Kafka这边要先转成Avro,Avro处理完再转回Protobuf——这一来一回,光是序列化转换就多花了将近两百毫秒。”
李骁靠在消防通道的墙壁上,用指尖轻轻敲了两下墙面。消防通道里很冷,十月底的夜风从门缝里钻进来,带着混凝土楼梯间特有的阴凉。
“解决方案呢?”
“两条路。”
陈启明显然是已经跟团队讨论过了,答案几乎是脱口而出。
“第一条路——统一序列化协议,要么全部切Protobuf,要么全部切Avro。全部切Protobuf的好处是赵鸣的模块不用改,但何博士那边要重写Kafka的连接器,工期至少多三天。”
“全部切Avro的好处是Kafka原生兼容,但赵鸣的语义聚类模块要从底层重写序列化接口,他的模块比何博士的复杂,重写的工程量更大,保守估计五天。”
“第二条路呢?”
“不改协议,在两套协议之间加一个零拷贝的序列化转换层。原理是在内存里直接做Protobuf到Avro的二进制映射,跳过中间的标准序列化步骤。这条路的工期最短——何博士预估明天中午之前能做完。但有一个风险。”
陈启明的声音变得谨慎起来,“零拷贝转换层目前还是一种比较新的技术方案,在开源社区里能找到的成熟案例不多。何博士说他能写出来,但代码的稳定性没有经过长时间验证,我们没办法保证在演示当天不会出幺蛾子。”
“选第二条路。”
李骁几乎没有犹豫,“明天中午之前把转换层做出来,下午跑第一轮联合压测。告诉何博士,代码不需要完美,只需要在演示那十五分钟内不崩。演示之后他有的是时间重构。”
“明白。”陈启明应了一声,但没有挂电话。他犹豫了两秒,又开口了,这次的语气跟刚才汇报技术问题时明显不同,多了一层欲言又止的沉重。
“李总,还有个事。”
“说。”
“小周—