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


总之 , 目前 Kafka Streams 只支持与 Kafka 集群进行交互 , 它没有提供开箱即用的外部数据源连接器 。
协调方式
在分布式协调方面 , Kafka Streams 应用依赖于 Kafka 集群提供的协调功能 , 来提供高容错性和高伸缩性 。
Kafka Streams 应用底层使用了消费者组机制来实现任意的流处理扩缩容 。 应用的每个实例或节点 , 本质上都是相同消费者组下的独立消费者 , 彼此互不影响 。 它们之间的协调工作 , 由 Kafka 集群 Broker 上对应的协调者组件来完成 。 当有实例增加或退出时 , 协调者自动感知并重新分配负载 。

我画了一张图来展示每个 Kafka Streams 实例内部的构造 , 从这张图中 , 我们可以看出 , 每个实例都由一个消费者实例、特定的流处理逻辑 , 以及一个生产者实例组成 , 而这些实例中的消费者实例 , 共同构成了一个消费者组 。
差异|Kafka Streams与其他流处理平台的差异在哪里?
本文插图

通过这个机制 , Kafka Streams 应用同时实现了高伸缩性和高容错性 , 而这一切都是自动提供的 , 不需要你手动实现 。
而像 Flink 这样的框架 , 它的容错性和扩展性是通过专属的主节点(Master Node)全局来协调控制的 。
Flink 支持通过 ZooKeeper 实现主节点的高可用性 , 避免单点失效:某个节点出现故障会自动触发恢复操作 。 这种全局性协调模型对于流处理中的作业而言非常实用 , 但不太适配单独的流处理应用程序 。 原因就在于它不像 Kafka Streams 那样轻量级 , 应用程序必须要实现特定的 API 来开启检查点机制(checkpointing) , 同时还需要亲身参与到错误恢复的过程中 。
应该这样说 , 在不同的场景下 , Kafka Streams 和 Flink 这种重量级的协调模型各有优劣 。
消息语义保障
我们刚刚提到过 EOS , 目前很多流处理框架都宣称它们实现了 EOS , 也包括 KafkaStreams 本身 。 关于精确一次处理语义 , 有一些地方需要澄清一下 。

实际上 , 当把 Spark、Flink 与 Kafka 结合使用时 , 如果不使用 Kafka 在 0.11.0.0 版本引入的幂等性 Producer 和事务型 Producer , 这些框架是无法实现端到端的 EOS 的 。
因为这些框架与 Kafka 是相互独立的 , 彼此之间没有任何语义保障机制 。 但如果使用了事务机制 , 情况就不同了 。 这些外部系统利用 Kafka 的事务机制 , 保障了消息从 Kafka 读取到计算再到写入 Kafka 的全流程 EOS 。 这就是所谓的端到端精确一次处理语义 。
之前 Spark 和 Flink 宣称的 EOS 都是在各自的框架内实现的 , 无法实现端到端的 EOS 。 只有使用了 Kafka 的事务机制 , 它们对应的 Connector 才有可能支持端到端精确一次处理语义 。
Spark 官网上明确指出了用户若要实现与 Kafka 的 EOS , 必须自己确保幂等输出和位移保存在同一个事务中 。 如果你不能自己实现这套机制 , 那么就要依赖于 Kafka 提供的事务机制来保证 。
而 Flink 在 Kafka 0.11 之前也宣称提供 EOS , 不过是有前提条件的 , 即每条消息对Flink应用状态的影响有且只有一次 。
举个例子 , 如果你使用 Flink 从 Kafka 读取消息 , 然后不加任何处理直接写入到 MySQL , 那么这个操作就是无状态的 , 此时 Flink 无法保证端到端的 EOS 。

换句话说 , Flink 最后写入到 MySQL 的 Kafka 消息可能有重复的 。 当然 , Flink 社区自 1.4版本起正式实现了端到端的 EOS , 其基本设计思想正是基于 Kafka 0.11 幂等性 Producer的两阶段提交机制 。
两阶段提交(2-Phase Commit , 2PC)机制是一种分布式事务机制 , 用于实现分布式系统上跨多个节点事务的原子性提交 。 下面这张图来自于神书“Designing Data-IntensiveApplications”中关于 2PC 讲解的章节 。 它清晰地描述了一次成功 2PC 的过程 。 在这张图中 , 两个数据库参与到分布式事务的提交过程中 , 它们各自做了一些变更 , 现在需要使用2PC 来保证两个数据库的变更被原子性地提交 。 如图所示 , 2PC 被分为两个阶段:Prepare 阶段和 Commit 阶段 。 只有完整地执行了这两个阶段 , 这个分布式事务才算是提交成功 。


推荐阅读