Contexte
Une fois que j'ai vu le rééquilibrage de kafka, j'ai pensé que c'était très intéressant, alors j'ai essayé moi-même
conception expérimentale
Concevez un sujet avec 3 partitions pour vérifier la relation entre les partitions de temps des consommateurs 1, 2, 3 et 4 et les consommateurs respectivement
Procédure expérimentale
- Créer un sujet avec 3 partitions
//创建TopicName为topic-partition3的Topic并设置分区数为3以及副本数为1
@Bean
public NewTopic initialTopic() {
return new NewTopic("topic-partition3",3, (short) 1 );
}
复制代码
- Un producteur produit une donnée à chacune des 3 partitions toutes les 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);
}
}
复制代码
- Consommer des données une par une dans le même groupe de consommateurs, chacun prend 800 ms
//声明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);
}
复制代码
- Lorsqu'il n'y a qu'un seul consommateur, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-2, topic-partition3-0]
- Lorsqu'il y a deux consommateurs, C1 imprime
ypq-group: partitions assigned: [topic-partition3-1, topic-partition3-0]
, C2 imprimeypq-group: partitions assigned: [topic-partition3-2]
- Trois consommateurs, impression C1
ypq-group: partitions assigned: [topic-partition3-0]
, impression C2ypq-group: partitions assigned: [topic-partition3-1]
, impression C3ypq-group: partitions assigned: [topic-partition3-2]
- Lorsqu'il y a quatre consommateurs, C1-3 imprime sans changement, C4 imprime
ypq-group: partitions assigned: []
Statistiques expérimentales
nombre de consommateurs | P1 | P2 | P3 |
---|---|---|---|
1 | C1 | C1 | C1 |
2 | C1 | C1 | C2 |
3 | C1 | C2 | C3 |
4 | C1 | C2 | C3 |
Résumer
- Lorsque le nombre de consommateurs est supérieur au nombre de partitions, des consommateurs inactifs sont générés, car chaque partition ne peut être consommée que par un seul consommateur au maximum
- La stratégie de rééquilibrage par défaut de Kafka est la plage, et le reste du nombre de partitions du nombre de consommateurs sera alloué aux principaux consommateurs, de sorte que les principaux consommateurs subissent une forte pression
- Il n'est pas garanti que les données de différentes partitions sous le même sujet soient en ordre, mais les données de la même partition sont garanties d'être en ordre
- Si un consommateur veut consommer en multithread, il doit assurer lui-même l'ordre des données de la consommation multithread
- Les consommateurs doivent également envisager des scénarios de consommation répétée de données