【问题标题】:Apache Kafka with multiple partitions distributed deployment具有多分区分布式部署的 Apache Kafka
【发布时间】:2021-05-15 14:55:31
【问题描述】:

我有一个包含 10 个分区的 kafka 主题。我计划在不同的服务器上部署两个应用程序。一个应用程序将从分区 0 到 4 读取。而另一个应用程序将从分区 5 到 9 读取。
部署 1

@KafkaListener(topicPartitions =
        { @TopicPartition(topic = "testpartition", partitions = { "0", "1","2", "3","4" })
              
              })
    public void receive(ConsumerRecord record) {
        System.out.println(String.format("Listener 1 -Topic - %s, Partition - %d, Value: %s", kafkaTopic, record.partition(), record.value()));
    }

部署 2

@KafkaListener(topicPartitions =
        { @TopicPartition(topic = "testpartition", partitions = { "5", "6","7", "8","9" })
              
              })
    public void receive(ConsumerRecord record) {
        System.out.println(String.format("Listener 2 -Topic - %s, Partition - %d, Value: %s", kafkaTopic, record.partition(), record.value()));
    }

所以我们将有两个消费者组,因为应用程序分别部署在不同的服务器上。
由于每个应用程序都从不同的分区消费 这会导致对 kafka 主题的消息进行不必要的复制吗?
所有消息都会被复制两次。另外,如果是这种情况,是否会出现消息重复?
这是在分布式环境中部署消费者应用程序的正确方法还是有更好的方法?

【问题讨论】:

    标签: spring spring-boot apache-kafka kafka-consumer-api spring-kafka


    【解决方案1】:

    由于您是手动分配分区,不,不会有重复,每个实例只会从其分配的分区接收记录。

    当你说“复制”时;这取决于创建主题时的复制因子。副本用于确保不同代理实例上有多个副本,以处理服务器故障。复制不等于复制。

    但即使以这种方式复制记录,每条记录也只有一个逻辑实例。

    在某些(罕见的)失败场景中可能获得重复记录,除非您启用仅一次语义。

    另一种部署方式是使用 Kafka 组管理,让 Kafka 使用其默认算法或使用自定义 ConsumerPartitionAssignor 跨实例分配分区。

    【讨论】:

    • 感谢加里的输入。如果侦听器处于单独部署中,是否可以应用 Kafka 组管理。我知道如果有一个项目,那么所有消费者都有我想要的相同组,因此 Kafka 在他们之间分发它。但这不是分布式部署的情况
    • 他们必须在同一个组中。没有理由不能通过多个部署做到这一点。
    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2020-01-02
    • 2022-01-01
    • 1970-01-01
    • 2011-05-17
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多