繁体   English   中英

多个 Kafka 分区到 Akka Streams

[英]Multiple Kafka Partitions to Akka Streams

嗨,我正在与KafkaAkka Streams Kafka的主题MyTestTopic我有 3 个分区,数据以大约1000 QPS高并发率推送到主题中,并且只会高于此值。

下面是我的 Akka Stream Kafka Consumer 代码:

final ConsumerSettings<String, byte[]> consumerSettings =
        ConsumerSettings.create(kafkaConfig, new StringDeserializer(), new ByteArrayDeserializer())
                .withBootstrapServers("127.0.0.1:9092")
                .withGroupId("TestConsumerGroup")
                .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
                .withProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false")
                .withProperty(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, String.valueOf(timeout));

ActorMaterializer materializer = ActorMaterializer.create(system);

RestartSource.onFailuresWithBackoff(
        java.time.Duration.ofSeconds(3),
        java.time.Duration.ofSeconds(3000),
        0.2,
        () -> Consumer.atMostOnceSource(consumerSettings, Subscriptions.topics("MyTestTopic"))
                .mapAsyncUnordered(10,
                        record -> ask(rootHandler, new StreamData(record), Duration.ofSeconds(timeout))))
        .to(Sink.foreach(App::sinkParser))
        .run(materializer);

我的问题:

  • 我如何定义多个Akka Stream consumers来侦听不同的Kafka partitions因为导致单个 Akka Steam 实例的多个分区似乎是一个bottle-neck
  • Akka Clustering这个问题的答案吗? 在基于云的环境中自动扩展静态服务器上的2 seed nodesmultiple akka stream consumers

我似乎无法弄清楚,我需要帮助,谢谢

有几种方法可以解决这个问题,具体取决于您尚未详细说明的细节:

如果您有理由确信一个节点可以处理所有消息,您可以设置多个流,每个分区最多 1 个流。

一种演变是使用CommittablePartitionedSource以便您动态创建与分区一样多的流。 请注意,您需要手动提交偏移量(例如使用Committer.sink )。

每个实例可以有一个流,并且可以部署与分区一样多的实例; 对于相同的消费者组,实例将在它们之间协调分区分配。 在部署多个实例时,您可能需要也可能不需要 Akka 集群,这取决于您ask参与者正在做什么的性质。

如果actor中没有为每条消息维护状态(请注意,这将包括actor在外部数据存储上执行读取-修改-写入:如果您可以确保影响给定行的消息位于同一个Kafka分区中,您甚至可以在该外部数据存储中没有 ACID 的情况下进行),您可能不需要 Akka 集群。

如果参与者本身是有状态的(例如,他们正在隐藏一些物联网设备),那么您几乎肯定需要 Akka Cluster、Akka Cluster Sharding 和 Akka Persistence 的组合。 与在外部数据存储上执行读取-修改-写入的 Actor 相比,一直采用这种方式确实具有一些优势(例如,可以消除大部分读取以支持跟踪 Actor 中的状态并采用事件源)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM