Kafka Consumer的asyncCommit单线程下如何实现异步?
Kafka Consumer asyncCommit 单线程下的异步实现逻辑
首先明确:你不需要自己启动独立线程来跑asyncCommit,Kafka客户端内部已经帮你搞定了异步逻辑。
Kafka Consumer本身确实是非线程安全的,但asyncCommit的异步能力来自客户端内部维护的后台线程池,和你主线程是不是单线程没关系:
- 当你在主线程调用
asyncCommit()(或者带回调的asyncCommitAsync(OffsetCommitCallback))时,方法只是把「提交位移」这个任务打包好,扔进客户端内部的异步任务队列里,然后立刻返回,主线程该干嘛干嘛,完全不用等提交操作完成。 - 客户端后台的线程池会自动从队列里取出这些任务,负责和Kafka Broker建立网络连接、发送位移提交请求、等待响应这些耗时的IO操作。
- 如果你指定了提交回调,回调逻辑也会在这个后台线程池里执行——这里要注意,回调里绝对不能调用Consumer的其他方法,因为Consumer本身非线程安全,后台线程和主线程同时操作Consumer实例会出问题。
你觉得必须开独立线程才能异步,是把「业务线程的异步」和「客户端内部的异步实现」搞混了。Kafka的异步提交是客户端封装好的能力,不需要业务层额外开线程。
内容的提问来源于stack exchange,提问作者Zuckerman
相关产品推荐
相关产品推荐

