Я думаю, что в повседневной разработке все слышали о Kafka. Как платформа распределенной потоковой обработки, Kafka обычно используется для хранения и передачи больших объемов данных сообщений. В Kafka есть три важных понятия: тема, раздел и смещение.
Тема — это логическая концепция, в которой сообщения в Kafka классифицируются по темам. Производитель отвечает за отправку сообщений в определенную тему, а потребитель отвечает за подписку на эту тему и ее использование.
partition да topic физические понятия, каждое topic можно разделить на несколько раздел, каждый partition принадлежит только одному тема и содержит разные сообщения и разделы используется для улучшения topic Потребление производительности и масштабируемости хранилища может быть topic разбросаны по множеству broker включен и поддерживает несколько consumer Параллельное потребление.
offset да partition Уникальный идентификатор каждого сообщения в монотонно возрастающем и неизменяемом значении определяется выражением kafka Автоматическое обслуживание, смещение Используется для поиска и записи сообщений в partition Местоположение и прогресс потребления в partition Сообщения внутри в порядке.
offset Роль и значение
Смещение — это уникальный номер, присвоенный Kafka каждому сообщению, который представляет собой последовательную позицию сообщения в разделе. Смещение начинается с 0 и увеличивается на 1 каждый раз, когда в раздел записывается новое сообщение. Смещение является неизменным и не будет меняться или использоваться повторно, даже если сообщение будет удалено или срок его действия истечет.
Существует две основные функции смещения:
Да используется для поиска сообщения. Указав offset,Потребитель может найти в разделе ровно одно сообщение.,Или Пользователь начинает получать сообщения из определенного места.
Эрда используется для регистрации прогресса потребления. Потребители потребляют После окончания сообщения нужно Отправить смещение приди и расскажи Kafka broker Куда вы потратили свои деньги? Таким образом, в случае сбоя или перезапуска потребителя он сможет использовать сохраненные offset восстановить статус потребления.
offset хранение и управление
offset хранение и управление в основном включает в себя два аспекта: продюсераи Потребительская сторона。
сторона продюсера
Когда производитель отправляет сообщение в Kafka, он может указать ключ раздела (Partition Key), и Kafka решит, в какой раздел следует отправить сообщение, на основе этого ключа и алгоритма разделения. Если ключ раздела не указан, Kafka будет использовать циклический или случайный выбор для выбора разделов. Производители также могут настраивать алгоритмы разделения.
Когда сообщение записывается в раздел, брокер Kafka присваивает сообщению смещение и возвращает его производителю. Производитель может подтвердить, было ли сообщение успешно записано, на основе возвращенного смещения, и выполнить повторную попытку или другую обработку.
Потребительская сторона
Когда потребители потребляют сообщения Kafka, им необходимо поддерживать текущее потребляемое значение смещения и зафиксированное значение смещения. Текущее использованное значение смещения указывает позицию сообщения, которое потребляет потребитель, а представленное значение смещения указывает положение сообщения, потребление которого, как подтвердил потребитель, подтверждено.
Потребители потребляют После окончания сообщения нужно Отправить смещение обновить отправленные offset ценить。Отправить смещение Есть два способа: автоматическая подача и подача вручную.
автоматическийпредставлять на рассмотрение:Kafka Предоставляется параметр конфигурации. Enable.auto.commit, по умолчанию правда, означает включение автоматического положения на рассмотрение Функция。автоматическийпредставлять на Функция лечения периодически запускается в фоновом режиме (по auto.commit.interval.ms контроль параметров) в настоящее время будет потреблять offset ценитьпредставлять на рассмотрение Давать Kafka broker。
Руководствопредставлять на рассмотрение:если enable.auto.commit установлен на ложь, это означает отключение автоматического положения на функция защиты, в это время потребителю необходимо вызвать ее вручную commitSync или commitAsync метод Отправить смещение。Руководствопредставлять на Функция обработки дает потребителям больше возможностей контролировать, когда и как отправлять товар. смещение。
Независимо от того, отправлено ли оно автоматически или вручную, фактическое место хранения смещений находится во встроенной теме Kafka: __consumer_offsets. Эта тема имеет 50 разделов (настраиваемых), каждый раздел хранит информацию о смещении части группы потребителей (Consumer Group). Брокер Kafka рассчитает хэш-значение на основе идентификатора группы потребителей и имени темы и сопоставит его с разделом темы __consumer_offsets.
Тема __consumer_offsets — это новая функция, представленная в Kafka версии 0.9.0. В предыдущей версии смещения сохранялись в Zookeeper. Но Zookeeper не подходил для больших операций записи, поэтому позже он был сохранен в самом Kafka, что повысило производительность и надежность.
offset Зафиксировать и сбросить
Отправить смещение После того, как потребитель потребляет сообщение,текущий потребляемый offset значение обновлено до Kafka broker операции в。Отправить смещение Цель состоит в том, чтобы записывать ход потребления, чтобы в случае сбоя или перезапуска потребителя он мог продолжить потребление с последней позиции потребления.
сброс смещения Когда потребитель запускается или работает, потребляемый в данный момент offset Операция изменения значения на другое значение. сброс смещения Цель состоит в том, чтобы отрегулировать положение потребления так, чтобы при необходимости повторного потребления или пропуска определенных сообщений это требование могло быть достигнуто.
Отправить смещение
Отправить смещение Есть два способа: автоматическая подача и подача Различия и использование этих двух методов были представлены ранее, поэтому я не буду здесь вдаваться в подробности. Необходимо обратить внимание на да, независимо от да автоматического положения на рассмотрениевозвращатьсяда Руководствопредставлять на рассмотрение,Нет никаких гарантий высокого положения на сохранить успех. потому что Kafka broker Возможная неисправность или задержка сети, что может привести к повреждению на сбой или задержка ремонта. Поэтому потребителям приходится иметь дело с властью. на исправить ситуацию сбоя или задержки.
представлять на рассмотрениенеудача:еслипредставлять на Если лечение не удалось, потребитель может решить попробовать еще раз или отказаться. Повторная попытка может привести к получению нескольких должностей. на рассмотрениетот же самый offset значение, но да не влияет на корректность, поскольку Kafka broker Дубликаты будут игнорироваться offset ценить. Если вы сдадитесь, это может привести к повторному использованию использованных сообщений при следующем запуске, но это не повлияет на целостность, поскольку Kafka Сообщения идемпотентны.
представлять на рассмотрение Задерживать:еслипредставлять на В случае задержки потребители могут выбрать: подождать или продолжить. Ожидание может привести к замедлению или превышению потребления. session.timeout.ms параметр установлен и считается мертвым. Если вы продолжите, это может привести к тому, что некоторые недостающие файлы будут пропущены при следующем запуске. на новости об успехах.
сброс смещения
сброс смещения Есть два способа: перезагрузка вручную и автоматическая перезагрузка. Ручная перезагрузка относится к активному звонку потребителя. seek или seekToBeginning или seekToEnd Метод изменения текущего потребления offset ценить. Автоматическая перезагрузка означает, что потребитель запускается в соответствии с auto.offset.reset Параметры, позволяющие определить, с чего начать потребление.
Ручная перезагрузка: Ручная перезагрузка позволяет потребителям точно контролировать, с чего начать потребление. Например,Если вы хотите повторно использовать все сообщения в определенном разделе,Можно позвонить seekToBeginning метод будет offset установлен на 0, если вы хотите пропустить все сообщения для определенного раздела, вы можете позвонить; seekToEnd метод будет offset установлен максимальное значение, если вы хотите начать потребление с определенного места, вы можете позвонить; seek метод будет offset установлен на любое значение.
автоматическийперезагрузить:автоматическийперезагрузить Позволяет потребителям начать работу на основе auto.offset.reset Параметры, позволяющие определить, с чего начать потребление.auto.offset.reset Параметр имеет три необязательных значения: самое раннее, latest и none。earliest Указывает, что потребление начинается с самого раннего доступного сообщения; Указывает, что потребление начинается с последнего доступного сообщения. Указывает, что если нет доступных смещение, выдается исключение.
offset расход и гарантия
offset расход и гарантия В основном включает в себя два аспекта:последовательностьипоследовательность。
последовательность
последовательностьдаобратитесь к Kafka Обрабатываются ли сообщения в том порядке, в котором они были отправлены и получены. Кафка Гарантируется только информация в разделе, то есть сообщения в том же разделе соответствуют offset Отправьте и получите в заказе. Однако да не гарантирует межтемовую последовательность внутри темы, то есть сообщения в разных разделах могут отправляться и получаться не по порядку. Поэтому, если вам необходимо обеспечить межтематическое последовательность внутри темы, вам необходимо убедиться, что производитель и Потребительская сторона выполняет дополнительную обработку, например, использует тот же ключ раздела и ту же группу потребителей.
последовательность
последовательностьдаобратитесь к Kafka Может ли сообщение быть отправлено и получено правильно, без потери или дублирования. Кафка Предусмотрено три различных уровня гарантии последовательности: До одного раза (При most один раз), хотя бы один раз (В least один раз) и именно once)。
Не более одного раза: не более одного раза да означает Kafka Сообщения будут отправлены и получены только один и ноль раз, дублирования не будет, но они могут быть потеряны. Как эта гарантия реализуется да в сторону продюсера Отключите функцию повтора, в Потребительской сторонаперед потреблением сообщений Отправить смещение. Эта гарантия подходит для сценариев, не чувствительных к потере сообщений, таких как сбор журналов и мониторинг.
Хоть раз: хоть раз да значит Kafka Сообщения будут отправлены и получены только один и несколько раз и не будут потеряны, но могут быть дубликаты. Как эта гарантия реализуется да в сторону продюсер включает функцию повтора, в Потребительской сторонапосле потребления сообщений Отправить смещение. Эта гарантия подходит для сценариев, не чувствительных к дублированию сообщений, таких как подсчет и накопление.
Ровно один раз: Ровно один раз да означает Kafka Сообщения будут отправлены и получены только один раз и не будут потеряны или повторены. Как эта гарантия реализуется да в сторону продюсераи Потребительская сторона Используйте функцию транзакции в Потребительской сторона использует идемпотентные функции. Эта гарантия подходит для сценариев, чувствительных к потере и дублированию сообщений, таких как переводы и платежи.
Наконец, я надеюсь, что эта статья поможет вам понять смещение Кафки, спасибо за чтение.