Reequilíbrio de Kafka

fundo

Uma vez que vi o reequilíbrio do kafka, achei muito interessante, então tentei eu mesmo

design experimental

Projete um tópico com 3 partições para verificar a relação entre as partições de tempo do consumidor 1, 2, 3 e 4 e os consumidores, respectivamente

Procedimento experimental

  1. Crie um tópico com 3 partições
//创建TopicName为topic-partition3的Topic并设置分区数为3以及副本数为1
@Bean
public NewTopic initialTopic() {
    return new NewTopic("topic-partition3",3, (short) 1 );
}
复制代码
  1. Um produtor produz um dado para cada uma das 3 partições a cada 1000 ms
@Test
public void testProducer() throws InterruptedException {
    for (int i = 0; i < 5000; i++) {
        kafkaTemplate.send("topic-partition3", 0, null, "data package from partition0 [" + i + "]");
        kafkaTemplate.send("topic-partition3", 1, null, "data package from partition1 [" + i + "]");
        kafkaTemplate.send("topic-partition3", 2, null, "data package from partition2 [" + i + "]");
        //休眠1秒
        Thread.sleep(1000);
    }
}
复制代码
  1. Consumindo dados um a um no mesmo grupo de consumidores, cada um leva 800ms
//声明consumerID为ypq-consumer, 消费组ypq-group, 为监听topicName为topic-partition3的Topic
@KafkaListener(id = "ypq-consumer", groupId = "ypq-group", topics = "topic-partition3")
public void listen(String msgData) throws InterruptedException {
    LOGGER.info("consume data : " + msgData);
    // 模拟耗时处理
    Thread.sleep(800);
}
复制代码
  1. Quando há apenas um consumidor, C1 imprimeypq-group: partitions assigned: [topic-partition3-1, topic-partition3-2, topic-partition3-0]
  2. Quando há dois consumidores, C1 imprime ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-0], C2 imprimeypq-group: partitions assigned: [topic-partition3-2]
  3. Três consumidores, impressão C1 ypq-group: partitions assigned: [topic-partition3-0], impressão C2 ypq-group: partitions assigned: [topic-partition3-1], impressão C3ypq-group: partitions assigned: [topic-partition3-2]
  4. Quando há quatro consumidores, C1-3 imprime inalterado, C4 imprimeypq-group: partitions assigned: []

Estatísticas experimentais

número de consumidores P1 P2 P3
1 C1 C1 C1
2 C1 C1 C2
3 C1 C2 C3
4 C1 C2 C3

Resumir

  1. Quando o número de consumidores é maior que o número de partições, são gerados consumidores inativos, pois cada partição só pode ser consumida por um consumidor no máximo
  2. A estratégia de rebalanceamento padrão do Kafka é o intervalo, e o restante do número de partições para o número de consumidores será alocado para os principais consumidores, de modo que os principais consumidores estão sob grande pressão
  3. Não é possível garantir que dados em diferentes partições sob o mesmo tópico estejam em ordem, mas é garantido que os dados na mesma partição estão em ordem
  4. Se um consumidor deseja consumir multithread, ele precisa garantir a ordem dos dados de consumo multithread por si só
  5. Os consumidores também precisam considerar cenários de consumo repetido de dados

Acho que você gosta

Origin juejin.im/post/7087495701642346526
Recomendado
Clasificación