消息队列:Kafka Consumer 源码解读
以Kafka的JavaDoc如何使用 Consumer 为入口,了解消费者消费过程以及相关接口的源码解读来了解其实现。
消息的消费过程主要是:
设置必要的配置信息
创建消费者实例并订阅主题
拉取消息
接下来对相关的主题进行源码的解读。
消费流程实现
消息消费主要关注如下几个方面:
订阅过程是如何实现的?
Consumer 是如何与 Coordinator 协商,确定消费哪些 Partition 的?
拉取消息的过程是如何实现的?
订阅过程源码解读
Kafka 在文档中明确地注明了 Consumer 不是线程安全的,意味着 Consumer 被并发调用时会出现不可预期的结果。为了避免这种情况发生,Kafka 做了主动的检测并抛出异常,而不是放任系统产生不可预期的情况。Kafka“主动检测不支持的情况并抛出异常,避免系统产生不可预期的行为”这种模式,对于增强的系统的健壮性是一种非常有效的做法[1],具体实现可以参考 Kafka 的 acquireAndEnsureOpen 的实现。这对于我们的编程实现有很好的参考价值,如果系统不支持用户的某种操作,正确的做法是,检测不支持的操作,直接拒绝用户操作,并给出明确的错误提示,而不应该只是在文档中写上“不要这样做”,却放任用户错误的操作,产生一些不可预期的、奇怪的错误结果[1]。
接下来,对订阅过程中重要的步骤:更新订阅状态和更新元数据进行源码解读。
更新订阅状态源码解读
更新元数据源码解读
那么元数据是如何进行更新的呢?
拉取消息实现
李玥老师给出的拉取消息的时序图:
参考资料
极客时间:李玥的《消息队列高手专栏》
版权声明: 本文为 InfoQ 作者【正向成长】的原创文章。
原文链接:【http://xie.infoq.cn/article/f980d31099c5b99a33018e980】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论