Потребительское приложение Kafka имеет серьезные задержки (недостаточно быстрое потребление событий kafka в час пик). Тема kafka имеет 120 разделов, а группа потребителей имеет в общей сложности 30 хостов, и у каждого хоста есть два потребителя, поэтому каждый потребитель потребляет от 2 разделов kafka. Мы используем хосты AWS C5.9xlarge с 32 ядрами. Каждый потребитель был помещен в один java.lang.Thread, и внутри каждого потока создается ThreadPool с 250 потоками.
Мы убедились, что ни один из CPU / Memory / IO не является узким местом. Затем мы увеличили 250 рабочих до 500 рабочих, но задержка осталась. Затем мы вернулись к 250 рабочим, но увеличили до 4 потребителей на хост с 2. В результате каждый потребитель потребляет один раздел kafka. И теперь проблема решена, латентность упала до очень низкой.
Мой вопрос: почему увеличение с 250 до 500 в Threadpool не помогло, но помогло увеличение с 2 до 4 потребителей на хост?
private class ConsumerThread extends Thread {
public ConsumerThread(StremProcessor processor) {
this.processor = processor;
this.consumer = new KafkaConsumer()
}
@Override
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(250);
while (true) {
Data data = consumer.poll()
executor.invokeAll(getTasks(data, processor)); //processor is
}
}
}