antecedentes
Una vez que vi el reequilibrio de kafka, pensé que era muy interesante, así que lo probé yo mismo.
diseño experimental
Diseñe un tema con 3 particiones para verificar la relación entre las particiones de tiempo del consumidor 1, 2, 3 y 4 y los consumidores respectivamente
Procedimiento experimental
- Crear un tema con 3 particiones
//创建TopicName为topic-partition3的Topic并设置分区数为3以及副本数为1
@Bean
public NewTopic initialTopic() {
return new NewTopic("topic-partition3",3, (short) 1 );
}
复制代码
- Un productor produce un dato para cada una de las 3 particiones cada 1000ms
@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);
}
}
复制代码
- Consumiendo datos uno por uno en el mismo grupo de consumidores, cada uno toma 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);
}
复制代码
- Cuando solo hay un consumidor, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-2, topic-partition3-0]
- Cuando hay dos consumidores, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-0]
, C2 imprimeypq-group: partitions assigned: [topic-partition3-2]
- Tres consumidores, impresión C1
ypq-group: partitions assigned: [topic-partition3-0]
, impresión C2ypq-group: partitions assigned: [topic-partition3-1]
, impresión C3ypq-group: partitions assigned: [topic-partition3-2]
- Cuando hay cuatro consumidores, C1-3 imprime sin cambios, C4 imprime
ypq-group: partitions assigned: []
Estadísticas Experimentales
número de consumidores | P1 | P2 | P3 |
---|---|---|---|
1 | C1 | C1 | C1 |
2 | C1 | C1 | C2 |
3 | C1 | C2 | C3 |
4 | C1 | C2 | C3 |
Resumir
- Cuando la cantidad de consumidores es mayor que la cantidad de particiones, se generan consumidores inactivos, porque cada partición solo puede ser consumida por un consumidor como máximo.
- La estrategia de reequilibrio predeterminada de Kafka es el rango, y el resto de la cantidad de particiones a la cantidad de consumidores se asignará a los principales consumidores, por lo que los principales consumidores están bajo una gran presión.
- No se puede garantizar que los datos en diferentes particiones bajo el mismo tema estén en orden, pero se garantiza que los datos en la misma partición estén en orden
- Si un consumidor quiere consumir subprocesos múltiples, debe garantizar el orden de datos del consumo de subprocesos múltiples por sí mismo.
- Los consumidores también deben considerar escenarios de consumo repetido de datos.