Kafka Table使用哪个客户端ID

时间:2018-10-08 13:57:08

标签: java apache-kafka apache-kafka-streams

我正在尝试构建事件驱动的应用程序。 要求某些服务仅使用Kafka事件存储信息,因此我使用的是Kafka表。

我有两个共享同一张Kafka表的服务,这是一个复杂的业务逻辑,所以我想确保使用相同的代码来构建表。

我的问题是:我可以为同一个Kafka表的不同实例共享同一个客户端ID吗?

我已经构建了示例,并且可以运行一次。但是现在我遇到了一些问题。总是有一个例外:The state store, topic-name, may have migrated to another instance.

我的两个服务都在同一台机器上运行,没有容器。

我正在配置我的Kafka流:

Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG, applicationName);
config.put(StreamsConfig.CLIENT_ID_CONFIG, applicationName + "-client");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, ConfigurationResolver.get().resolve("kafka.broker"));
config.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 10 * 1000);
config.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 0);
config.put(StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG, IgnoreTypeMismatch.class);
config.put(StreamsConfig.DEFAULT_PRODUCTION_EXCEPTION_HANDLER_CLASS_CONFIG, IgnoreTypeMismatch.class);
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, GenericGsonSerde.class);
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
config.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 10 * 1000);
KafkaStreams streams = new KafkaStreams(builder.build(), config)
streams.cleanUp();
streams.start();
Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

1 个答案:

答案 0 :(得分:1)

如果您有两种不同的服务,则应使用两种不同的application.id。您无法在不同的服务上分片相同的KTable,但是每个服务都需要自己的KTable副本。因此,您可以对两个服务使用相同的代码来创建相同的KTable,然后让一个服务计算KTable,将其写入主题,然后让另一个服务使用该主题来获取KTable的副本。

如果要共享KTable,则需要使用单个application.id将两个服务合并为一个服务。