可以看到Consumer和Producer在逻辑处理上还是有较大不同的。
组件 | 处理请求 | 处理方式 |
---|---|---|
producer | 主要处理发送消息。对应RPC,主要是写请求 | 将业务逻辑和IO逻辑解耦。业务逻辑:组装batch;IO逻辑:基于batch组装request并发送request |
consumer | 既要发送fetchRequest,同时还要处理fetchResponse。对于RPC,读写请求都占比较大 | 业务逻辑和IO逻辑解耦,但是串行化。业务逻辑:从fetcher里poll已经fetch到的数据;IO逻辑:基于partition元数据组装fetchRequest,处理fetchResponse,发送fetchRequest |
Producer的IO是一个Sender线程在异步运行,为什么Consumer不这么干呢?
笔者觉得原因是:
Producer的逻辑是把消息往外发,所以Sender运行的越快,client这边为了维护batch而消耗的资源(内存和CPU越少);而如果Consumer也这么干,实际消费速度赶不上fetch速度的话,会需要额外的内存和CPU资源来维持更多的completedFetchs,更别说如果发生了rebalance的话,fetch过来的completedFetchs可能都是白fetch了。所以,总结下:1. 兼顾消费速度;2. 兼顾client的资源消耗&性能