Apache kafka 卡夫卡流媒体任务和内部状态存储的管理

Apache kafka 卡夫卡流媒体任务和内部状态存储的管理,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,假设我们在两台不同的机器(实例)上启动了两个具有以下属性的流任务:- public final static String applicationID = "StreamsPOC"; public final static String bootstrapServers = "10.21.22.56:9093"; public final static String topicname = "TestTransaction";

假设我们在两台不同的机器(实例)上启动了两个具有以下属性的流任务:-

public final static String applicationID = "StreamsPOC";
public final static String bootstrapServers = "10.21.22.56:9093";    
public final static String topicname = "TestTransaction";
public final static String shipmentTopicName = "TestShipment";
public final static String RECORD_COUNT_STORE_NAME = "ProcessorONEStore";
使用上述属性,以下是流任务的定义:-

        Map<String, String> changelogConfig = new HashMap();
        changelogConfig.put("min.insyc.replicas", "1");
        // Below line not working.
        changelogConfig.put("topic", "myChangedTopicLog");
       
        StoreBuilder kvStoreBuilder = Stores.keyValueStoreBuilder(
                Stores.persistentKeyValueStore(AppConfigs.RECORD_COUNT_STORE_NAME),
                AppSerdes.String(), AppSerdes.Integer()
        ).withLoggingEnabled(changelogConfig);

        kStreamBuilder.addStateStore(kvStoreBuilder);


        KStream<String, String> sourceKafkaStream = kStreamBuilder.stream
                (AppConfigs.topicname, Consumed.with(AppSerdes.String(), AppSerdes.String()));
Map changelogConfig=newhashmap();
changelogConfig.put(“min.insyc.replications”,“1”);
//下线不工作。
changelogConfig.put(“主题”、“myChangedTopicLog”);
StoreBuilder kvStoreBuilder=Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore(AppConfigs.RECORD\u COUNT\u STORE\u NAME),
AppSerdes.String(),AppSerdes.Integer()
).已启用日志(changelogConfig);
kStreamBuilder.addStateStore(kvStoreBuilder);
KStream sourceKafkaStream=kStreamBuilder.stream
(AppConfigs.topicname,consumered.with(AppSerdes.String(),AppSerdes.String());
现在,正如我所观察到的,卡夫卡在后台创建了主题(用于备份内部状态存储),名称如下:-
StreamsPOC processornestore changelog

第一个问题是:-两个不同的流任务是否都维护和备份同一主题的内部状态存储

第二个问题是:假设Task-1拾取分区1并将其写入其本地内部状态存储,Task-2开始处理分区2并将其写入其各自的本地状态存储,那么它是否不会引发数据被重写的风险,因为两个任务都将数据备份到同一个变更日志主题

第三个问题是:-如何指定自定义名称以更改日志主题


我们将非常感谢您的回复

首先,关于术语的一些思考:术语“任务”在卡夫卡流中有一个很好的定义,作为一个用户,您不需要自己创建任务。执行程序时,Kafka Streams会创建“独立计算单元”的任务,并为您执行这些任务。-我想,你所说的“任务”实际上是一个
KafkaStreams
客户机(称为实例)

如果使用相同的
application.id
启动多个实例,它们将组成一个消费者组,并以数据并行方式共享负载。对于状态存储,每个实例将承载存储的一个碎片(有时也称为分区)。所有实例都使用相同的主题,该主题对每个存储碎片都有一个分区。从存储碎片到changelog分区有一个1:1的映射。此外,输入主题分区与任务之间有1:1的映射,任务与存储碎片之间有1:1的映射。因此,总的来说,它是一个1:1:1:1映射:对于每个输入主题分区,创建一个任务,每个任务保存一个状态存储碎片,每个存储碎片由changelog主题的一个分区支持。(即,底线是,输入主题分区的数量决定了您获得的并行任务和存储碎片的数量,而changelog主题的创建数量与您的输入主题相同。)

  • 因此,是的,所有实例都使用相同的变更日志主题
  • 由于任务是通过碎片和变更日志主题分区隔离的,因此它们不会相互覆盖。然而,任务的概念是每个任务处理不同(不重叠)的键空间,因此具有相同
    的所有记录都应由相同的任务处理。当然,此规则可能有例外,如果您的应用程序不使用非重叠的密钥空间,程序将只执行(当然,根据您的业务逻辑要求,这可能是正确的,也可能是错误的)
  • 您似乎已经这样做了:注意,您只能自定义变更日志主题名称的一部分:
    --changelog
    --也就是说,您可以选择
    应用程序.id
    商店名
    。不过,总体命名模式是硬编码的

  • 首先,关于术语的一些想法:“任务”一词在卡夫卡流中有很好的定义,作为一个用户,您不需要自己创建任务。执行程序时,Kafka Streams会创建“独立计算单元”的任务,并为您执行这些任务。-我想,你所说的“任务”实际上是一个
    KafkaStreams
    客户机(称为实例)

    如果使用相同的
    application.id
    启动多个实例,它们将组成一个消费者组,并以数据并行方式共享负载。对于状态存储,每个实例将承载存储的一个碎片(有时也称为分区)。所有实例都使用相同的主题,该主题对每个存储碎片都有一个分区。从存储碎片到changelog分区有一个1:1的映射。此外,输入主题分区与任务之间有1:1的映射,任务与存储碎片之间有1:1的映射。因此,总的来说,它是一个1:1:1:1映射:对于每个输入主题分区,创建一个任务,每个任务保存一个状态存储碎片,每个存储碎片由changelog主题的一个分区支持。(即,底线是,输入主题分区的数量决定了您获得的并行任务和存储碎片的数量,而changelog主题的创建数量与您的输入主题相同。)

  • 因此,是的,所有实例都使用相同的变更日志主题
  • 由于任务是通过碎片和变更日志主题分区隔离的,因此它们不会相互覆盖。然而,任务的概念是每个任务处理不同(不重叠)的键空间,因此具有相同
    的所有记录都应由相同的任务处理。当然,此规则可能有例外,如果您的应用程序不使用非重叠的密钥空间,程序将只执行(当然,根据您的业务逻辑要求,这可能是正确的,也可能是错误的)
  • 看来你做了阿尔雷亚