我正在开发一个Kafka-Stream应用程序,它将从输入的Kafka主题中读取消息并过滤不需要的数据并推送到输出Kafka主题。
Kafka流配置:
InputConnection ic = getCurrentInputConnection();
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SLEEP));
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SLEEP));
KStream过滤器逻辑:
@Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
public KafkaStreamsConfiguration kStreamsConfigs() {
Map<String, Object> streamsConfiguration = new HashMap<>();
streamsConfiguration.put(ConsumerConfig.GROUP_ID_CONFIG, "abcd");
streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "QC-NormalizedEventProcessor-v1.0.0");
streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "test:9072");
streamsConfiguration.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
streamsConfiguration.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
streamsConfiguration.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE);
streamsConfiguration.put(StreamsConfig.producerPrefix(ProducerConfig.ACKS_CONFIG), -1);
streamsConfiguration.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, 3);
streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
streamsConfiguration.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, kafkaConsumerProperties.getConsumerJKSFileLocation());
streamsConfiguration.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, kafkaConsumerProperties.getConsumerJKSPwd());
streamsConfiguration.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
streamsConfiguration.put(SASL_MECHANISM, "PLAIN");
return new KafkaStreamsConfiguration(streamsConfiguration);
}
从基于Spring的Kafka Stream应用程序开始时,我遇到了异常。
@Bean
public KStream<String, String> kStreamJson(StreamsBuilder builder) {
KStream<String, String> stream = builder.stream(kafkaConsumerProperties.getConsumerTopic(), Consumed.with(Serdes.String(), Serdes.String()));
/** Printing the source message */
stream.foreach((key, value) -> LOGGER.info(THREAD_NO + Thread.currentThread().getId() + " *****Message From Input Topic: " + key + ": " + value));
KStream<String, String> filteredDocument = stream.filter((k, v) -> filterCondition.test(k, v));
filteredDocument.to(kafkaConsumerProperties.getProducerTopic(), Produced.with(Serdes.String(), Serdes.String()));
/** After filtering printing the same message */
filteredDocument.foreach((key, value) -> LOGGER.info(THREAD_NO + Thread.currentThread().getId() + " #####Filtered Document: " + key + ": " + value));
return stream;
}
我们的Kafka Infra团队授予了“ group.id”必要的权限,使用相同的“ group id”,我可以使用其他Kafka Consumer应用程序使用该消息,并且我按照我在“应用程序”中的意愿使用名称。 id” 。我们不会在Kafka访问控制列表中添加/更新“ application.id”。
我真的不确定我们是否需要为“ application.id”授予任何许可,或者是否缺少Kafka Stream配置中的某些内容。请指教。
请注意:我一直在遇到相同的异常的情况下尝试在Kafka Stream Configuration中使用“ group.id”和不使用“ group.id”。
谢谢! 巴拉蒂拉雅·尚穆甘
答案 0 :(得分:0)
我不在办公桌前,但我认为Streams将group.id设置为application.id。
答案 1 :(得分:0)
我们还需要设置对application.id的访问权限。 有关更多信息,请参阅-> https://docs.confluent.io/current/streams/developer-guide/security.html
安全的Kafka群集所需的ACL设置 Kafka群集可以使用ACL来控制对资源的访问(例如创建主题的能力),并且对于此类群集,包括Kafka Streams在内的每个客户端都需要作为特定用户进行身份验证才能获得适当的访问权限。特别是,在安全的Kafka群集上运行Streams应用程序时,运行该应用程序的主体必须设置ACL,以便该应用程序有权创建内部主题。由于所有内部主题以及嵌入的使用者组名称都以应用程序ID为前缀,因此建议在前缀资源模式上使用ACL来配置控制列表,以允许客户端管理以该前缀开头的所有主题和使用者组,例如-资源模式类型前缀--topic --operation全部(有关详细信息,请参见KIP-277和KIP-290)。例如,给定Streams应用程序的以下设置: •Config application.id的值是team1-streams-app1。 •以team1用户身份向Kafka集群进行身份验证。 •应用程序的编码拓扑从输入主题input-topic1和input-topic2读取。 •应用程序的拓扑写入输出主题output-topic1和output-topic2。 然后,以下命令将在Kafka集群中创建必要的ACL,以允许您的应用程序运行:
bin / kafka-acls ... --add --allow-principal用户:team1 --operation阅读--topic input-topic1 --topic input-topic2
bin / kafka-acls ... --add --allow-principal用户:team1 --operation编写--topic output-topic1 --topic output-topic2
bin / kafka-acls ... --add --allow-principal用户:team1 --operation所有--resource-pattern-type前缀的--topic team1-streams-app1 --group team1-streams-app1