JavaConsumer为什么采用单线程来获取消息?

在回答之前,如果先把这句话说出来,一定会加分:Java Consumer 是双线程的设计。一 个线 程是用户主线程,负责获取消息;另一个线程是心跳线程,负责向 Kafka 汇报消费者 存活情 况。将心跳单独放入专属的线程,能够有效地规避因消息处理速度慢而被视为下线 的“假死” 情况。

单线程获取消息的设计能够避免阻塞式的消息获取方式。单线程轮询方式容易实现异步非阻塞 式,这样便于将消费者扩展成支持实时流处理的操作算子。因为很多实时流处理操作算子都不 能是阻塞式的。另外一个可能的好处是,可以简化代码的开发。多线程交互的代码是非常容易 出错的。