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
- 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 );
}
复制代码
- 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);
}
}
复制代码
- 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);
}
复制代码
- Quando há apenas um consumidor, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-2, topic-partition3-0]
- Quando há dois consumidores, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-0]
, C2 imprimeypq-group: partitions assigned: [topic-partition3-2]
- Três consumidores, impressão C1
ypq-group: partitions assigned: [topic-partition3-0]
, impressão C2ypq-group: partitions assigned: [topic-partition3-1]
, impressão C3ypq-group: partitions assigned: [topic-partition3-2]
- Quando há quatro consumidores, C1-3 imprime inalterado, C4 imprime
ypq-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
- 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
- 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
- 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
- Se um consumidor deseja consumir multithread, ele precisa garantir a ordem dos dados de consumo multithread por si só
- Os consumidores também precisam considerar cenários de consumo repetido de dados