KSQL 是在后台发出远程请求,还是 Table 实际上是全局 KTable?

Is KSQL making remote requests under the hood, or is a Table actually a global KTable?

我有一个包含客户记录的 Kafka 主题,名为 "customer-created"。每个客户都是该主题中的一条新记录。有4个分区。

我有两个 ksql-server 实例 运行,基于 docker 图像 confluentinc/cp-ksql-server:5.3.0。两者使用相同的 KSQL Service Id.

我创建了一个 table:

CREATE TABLE t_customer (id VARCHAR, 
                         firstname VARCHAR, 
                         lastname VARCHAR)
WITH (KAFKA_TOPIC = 'customer-created', 
      VALUE_FORMAT='JSON', 
      KEY = 'id');

我是 KSQL 的新手,但我的理解是 KSQL 构建在 Kafka Streams 之上,并且每个 ksql-server 实例大致相当于一个 Kafka Streams 应用程序实例。我注意到的第一件事是,一旦我启动 ksql-server 的新实例,它就已经知道在第一个实例上创建的 tables/streams,即使它是开发人员模式下的交互式实例。其次,我可以 select 根据来自 both 实例的 ID 同一客户,但我预计只能从 one 的实例,因为我假设 KSQL Table 等同于 KTable,即它应该只包含本地数据,即来自 ksql-server 实例正在处理的分区。

SET 'auto.offset.reset'='earliest';
select * from t_customer where id = '7e1a141b-b8a6-4f4a-b368-45da2a9e92a1';

无论我将 ksql-cli 附加到哪个 ksql-server 实例,我都会得到一个结果。在使用普通 Kafka Streams 时,我可以让它工作的唯一方法是使用全局 KTable。我从这两个实例中得到的结果让我有点惊讶,因为 according to the docs,“只有 Kafka Streams DSL 有 GlobalKTable 的概念”,所以我希望两个实例中只有一个能找到客户。我没有在任何地方找到任何文档来解释如何指定 KSQL Table 应该是本地的还是全局的 table.

所以这是我的问题:KSQL Table 是否等同于 global KTable 而文档具有误导性,或者是 ksql -我连接到的服务器实例,在后台向负责 ID 的实例(可能基于分区)发出远程请求,如 here, for Kafka Streams?

所述

KSQL 不支持GlobalKTables atm.

您将 KSQL 服务器和 Kafka Streams 程序进行类比并不是 100% 准确。每个 query 都是一个 Kafka Streams 程序(注意,一个 "program" 可以有多个 instances)。此外,persistent 查询和 transient 查询之间存在差异。当您从主题创建 TABLE 时,命令本身只是一个元数据操作(类似于从主题创建流)。两者都没有执行任何查询,也没有启动 Kafka Streams 程序。

关于所有创建STREAMS和TABLES的信息存储在Kafka集群中的共享"command topic"中。具有相同 ID 的所有服务器都会收到有关创建的流、表的相同信息。

CLI 中的

查询运行 是瞬态 查询,它们将由单个服务器执行。有关此类临时查询的信息不会 分发到其他服务器。基本上,会生成一个唯一的查询 ID(即 application.id),并且服务器 运行 是一个单一实例 KafakStreams 程序。因此,server/program 将订阅所有分区。

persistent查询(即CREATE STREAM ASCREATE TABLE AS)是查询STREAM或TABLE并产生STREAM的查询或 TABLE 作为输出。有关持久查询的信息通过 "command topic" 分发到所有服务器(但是,并非所有服务器都会执行所有持久查询——这取决于配置的并行性,有多少服务器会执行它)。对于持久查询,每个参与执行查询的服务器都会创建一个 KafkaStreams 实例 运行ning 同一个程序,并且所有服务器都将使用相同的查询 ID(即 application.id),因此不同的服务器会订阅不同的主题。