差异|Kafka Streams与其他流处理平台的差异在哪里?( 二 )



Kafka 官网明确定义 Kafka Streams 是一个Java 客户端库(Client Library) 。 你可以使用这个库来构建高伸缩性、高弹性、高容错性的分布式应用以及微服务 。
使用 Kafka Streams API 构建的应用就是一个普通的 Java 应用程序 。 你可以选择任何熟悉的技术或框架对其进行编译、打包、部署和上线 。
在我看来 , 这是 Kafka Streams 与 Storm、Spark Streaming 或 Flink 最大的区别 。
Java 客户端库的定位既可以说是特色 , 也可以说是一个缺陷 。 目前 Kafka Streams 在国内推广缓慢的一个重要原因也在于此 。 毕竟 , 很多公司希望它是一个功能完备的平台 , 既能提供流处理应用 API , 也能提供集群资源管理与调度方面的能力 。 所以 , 这个定位到底是特色还是缺陷 , 仁者见仁、智者见智吧 。
Kafka Streams与其他框架的差异
接下来 , 我从应用部署、上下游数据源、协调方式和消息语义保障(SemanticGuarantees)4 个方面 , 详细分析一下 Kafka Streams 与其他框架的差异 。
应用部署
首先 , 我们从流处理应用部署方式上对 Kafka Streams 及其他框架进行区分 。

我们刚刚提到过 , Kafka Streams 应用需要开发人员自行打包和部署 , 你甚至可以将Kafka Streams 应用嵌入到其他 Java 应用中 。 因此 , 作为开发者的你 , 除了要开发代码之外 , 还要自行管理 Kafka Streams 应用的生命周期 , 要么将其打包成独立的 jar 包单独运行 , 要么将流处理逻辑嵌入到微服务中 , 开放给其他服务调用 。
但不论是哪种部署方式 , 你需要自己处理 , 不要指望 Kafka Streams 帮你做这些事情 。
相反地 , 其他流处理平台则提供了完整的部署方案 。 我以 Apache Flink 为例来解释一下 。 在 Flink 中 , 流处理应用会被建模成单个的流处理计算逻辑 , 并封装进 Flink 的作业中 。 类似地 , Spark 中也有作业的概念 , 而在 Storm 中则叫拓扑(Topology) 。 作业的生命周期由框架来管理 , 特别是在 Flink 中 , Flink 框架自行负责管理作业 , 包括作业的部署和更新等 。 这些都无需应用开发人员干预 。

另外 , Flink 这类框架都存在资源管理器(Resource Manager)的角色 。 一个作业所需的资源完全由框架层的资源管理器来支持 。 常见的资源管理器 , 如 YARN、Kubernetes、Mesos 等 , 比较新的流处理框架(如 Spark、Flink 等)都是支持的 。 像 Spark 和 Flink这样的框架 , 也支持 Standalone 集群的方式 , 即不借助于任何已有的资源管理器 , 完全由集群自己来管理资源 。 这些都是 Kafka Streams 无法提供的 。
因此 , 从应用部署方面来看 , Kafka Streams 更倾向于将部署交给开发人员来做 , 而不是依赖于框架自己实现 。
上下游数据源
谈完了部署方式的差异 , 我们来说说连接上下游数据源方面的差异 。 简单来说 , KafkaStreams 目前只支持从 Kafka 读数据以及向 Kafka 写数据 。 在没有 Kafka Connect 组件的支持下 , Kafka Streams 只能读取 Kafka 集群上的主题数据 , 在完成流处理逻辑后也只能将结果写回到 Kafka 主题上 。
反观 Spark Streaming 和 Flink 这类框架 , 它们都集成了丰富的上下游数据源连接器(Connector) , 比如常见的连接器 MySQL、ElasticSearch、HBase、HDFS、Kafka等 。 如果使用这些框架 , 你可以很方便地集成这些外部框架 , 无需二次开发 。

当然 , 由于开发 Connector 通常需要同时掌握流处理框架和外部框架 , 因此在实际使用过程中 , Connector 的质量参差不齐 , 在具体使用的时候 , 你可以多查查对应的jira 官网 , 看看有没有明显的“坑” , 然后再决定是否使用 。
在这个方面 , 我是有前车之鉴的 。 曾经 , 我使用过一个 Connector , 我发现它在读取Kafka 消息向其他系统写入的时候似乎总是重复消费 。 费了很多周折之后 , 我才发现这是一个已知的 Bug , 而且早就被记录在 jira 官网上了 。 因此 , 我推荐你多逛下 jira , 也许能提前避开一些“坑” 。


推荐阅读