使用Kafka的原生方法,将Confluent并行消费者扩展到极限
首先
在一般的流处理中,应用程序通过Producer API从主题中提取事件,并将经过处理的事件发送到另一个主题来进行数据处理。然而,与Kafka通信的应用程序还有其他多种使用模式,并且在某些情况下,应用程序的吞吐量可能不足。如果需要超过分区的并行处理能力的吞吐量,可以将数据写入数据库或其他存储,或在处理过程中执行其他同步通信处理(例如REST API通信)。
对于这个问题的解决方案,有多种方法可以采取,比如使用Go编写,或者采用响应式编程模型的方法,但一般来说,这都会涉及到较为根本性的解决方案的改变。
在本篇文章中,我将介绍Confluent Parallel Consumer,这是Confluent开放的另一种方法。
Kafka 消费者、分区和并行处理能力
如果增加Partition的数量,并根据其适当增加Consumer Group的大小,则处理能力几乎呈线性增长,但Kafka在管理Partition时有一些限制和负担,无法无限增加。另外,大多数情况下,我们希望的不是Partition单位的顺序保证,而是Key单位的顺序保证,但Kafka是通过以Partition单位来管理OFFSET(Consumer Group处理流的哪个点)信息的机制,并无法对Key单位的OFFSET进行追踪。
并行消费者的方法
键单位的偏移管理-偏移编码
Confluent Parallel Consumer以及普通的Kafka Consumer一样支持事务和Exactly Once语义,但为此需要对单个Key进行偏移量管理。Confluent Parallel Consumer会提交可以作为Partition的偏移量(之前所有的偏移量都已处理完毕),然后将未完整的偏移量进行序列化、压缩和BASE64编码,再将其作为元数据的一部分在提交偏移量时一同发送。
最后
“Confluent Parallel Consumer”是CSID Accelerator(客户解决方案创新部)项目的一部分,Confluent公司另外提供的专业支持。它是根据实际客户参与而衍生出的需求,并且扮演着补充Confluent平台无法提供功能的领域的角色。
其中,特别是此Parallel Consumer的源代码以Apache Licence 2.0开放,并且任何人都可以使用。