Kafka Consumer-Poll behaviour

я сталкиваюсь с некоторыми серьезными проблемами, пытаясь реализовать решение для моих нужд, в отношении KafkaConsumer (>=0.9).

давайте представим, что у меня есть функция, которая должна читать просто n сообщения из темы Кафки.

например: getMsgs(5) -->получает следующие 5 сообщений Кафки в теме.

Итак, у меня есть цикл, который выглядит так:

for (boolean exit= false;!exit;)
{
   Records = consumer.poll(200);
   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 сообщений).

есть ли решение для этого, или может (наверняка) я что-то пропустил?

спасибо заранее!!

4 ответов


вы можете установить max.poll.records на любой номер, который вам нравится, так что максимум вы получите столько записей на каждом опросе.

для вашего варианта использования, который вы указали в этой проблеме, вам не нужно явно фиксировать смещения самостоятельно. вы можете просто установить enable.auto.commit to trueи set auto.offset.reset to earliest такой, что он будет пинать, когда нет потребителя group.id (другими словами, когда вы собираетесь начать чтение с раздела В первый раз). Как только у вас будет группа.id и некоторые потребительские смещения, хранящиеся в Кафку и в случае, если ваша Кафка потребительскими процесс умирает, он будет продолжать с последней зафиксированной смещенной, поскольку это поведение по умолчанию, поскольку, когда потребитель начинает сначала искать если есть какие-либо совершенных взаимозачетов и если так, будет продолжаться с последней зафиксированной смещения и auto.offset.reset не удар.


установить авто.сдвиг.сбросить свойство как "последнее". Затем попробуйте использовать, вы получите потребленные записи из зафиксированного смещения.

или вы используете consumer.искать (TopicPartition, offset) api перед опросом.


вы отключили автоматическую фиксацию, установив enable.автоматический.совершите ложное. Вам нужно отключить это, если вы хотите вручную зафиксировать смещение. Без этого следующий вызов poll () автоматически зафиксирует последнее смещение сообщений, полученных от предыдущего poll ().


от Кафки 0.9 авто.сдвиг.имена параметров сброса изменены;

Что делать, если в Kafka нет начального смещения или если текущее смещение больше не существует на сервере (например, потому что эти данные были удалены):

earliest: automatically reset the offset to the earliest offset

latest: automatically reset the offset to the latest offset

none: throw exception to the consumer if no previous offset is found for the consumer's group

anything else: throw exception to the consumer.