Я сталкиваюсь с некоторыми серьезными проблемами, пытаясь найти решение для своих нужд, касающееся KafkaConsumer (> = 0,9).
Представьте, что у меня есть функция, которая должна читать только n сообщений из темы кафки.
Например: getMsgs(5)
→ получает следующие 5 сообщений кафки в теме.
Итак, у меня есть петля, которая выглядит следующим образом. Отредактировано с актуальными правильными параметрами. В этом случае для параметра max .poll.records
потребителя было задано значение 1, поэтому реальный цикл повторялся только один раз. Разные потребители (некоторые из них просматривали множество сообщений) разделяли абстрактного отца (вот этого), поэтому он так и кодировался. Часть numMss
была специальной для этого потребителя.
for (boolean exit= false;!exit;)
{
Records = consumer.poll(config.pollTime);
for (Record r:records) {
processRecord(r); //do my things
numMss++;
if (numMss==maximum) //maximum=5
exit=true;
}
}
Учитывая это, проблема в том, что метод poll() может получить более 5 сообщений. Например, если он получит 10 сообщений, мой код навсегда забудет эти 5 сообщений, поскольку Кафка будет думать, что они уже использованы.
Я попытался зафиксировать смещение, но, похоже, не работает:
consumer.commitSync(Collections.singletonMap(partition,
new OffsetAndMetadata(record.offset() + 1)));
Даже при конфигурации смещения каждый раз, когда я снова запускаю потребителя, он будет начинаться не с 6-го сообщения (помните, я просто хотел 5 сообщений), а с 11-го (поскольку первый опрос потреблял 10 сообщений).
Есть ли какое-то решение для этого, или, может быть (наверняка) я что-то упустил?
Заранее спасибо!!