Управление смещениями
Для каждой группы потребителей Kafka поддерживает фиксированное смещение для каждого потребляемого раздела. Когда потребитель обрабатывает сообщение, он не удаляет его из раздела. Вместо этого он просто обновляет свое текущее смещение, используя процесс, называемый его фиксацией.
Если после обработки сообщения произойдет сбой потребителя, но перед его смещением, информация о смещении не будет отражать обработку сообщения. Это означает, что сообщение будет снова обработано следующим потребителем в этой группе, которому будет назначен раздел.
Автоматическая фиксация смещений
Самый простой способ зафиксировать смещения - позволить потребителю Kafka сделать это автоматически. Это просто, но дает меньше контроля, чем фиксация вручную. По умолчанию потребитель автоматически фиксирует смещения каждые 5 секунд. Эта фиксация по умолчанию происходит каждые 5 секунд, независимо от того, как продвигается пользователь к обработке сообщений. Кроме того, когда потребитель вызывает poll()
, это также приводит к тому, что последнее смещение, возвращенное от предыдущего вызова к poll()
, будет зафиксировано (поскольку оно, вероятно, было обработано).
Если зафиксированное смещение опережает обработку сообщений и возникает сбой потребителя, возможно, некоторые сообщения не будут обработаны. Это связано с тем, что обработка возобновляется с зафиксированным смещением, которое позже, чем последнее сообщение, которое должно быть обработано до сбоя. По этой причине, если надежность важнее, чем простота, обычно лучше фиксировать смещения вручную.
Фиксация смещений вручную
Если для enable.auto.commit
установлено значение false, потребитель фиксирует свои смещения вручную. Он может делать это либо синхронно, либо асинхронно. Обычным шаблоном является фиксация смещения последнего обработанного сообщения на основе периодического таймера. Этот шаблон означает, что каждое сообщение обрабатывается по крайней мере один раз, но зафиксированное смещение никогда не опережает ход сообщений, которые активно обрабатываются. Частота периодического таймера контролирует количество сообщений, которые могут быть обработаны после сбоя потребителя. Сообщения извлекаются снова из последнего сохраненного зафиксированного смещения при перезапуске приложения или при перебалансировании группы.
Фиксированное смещение - это смещение сообщений, с которых обработка возобновляется. Обычно это смещение последнего обработанного сообщения плюс один.