← Назад ко всем вопросам

Какие знаешь гарантии доставки в Kafka

1️⃣ Как кратко ответить

Apache Kafka предоставляет три уровня гарантии доставки сообщений: "At most once" (не более одного раза), "At least once" (по крайней мере один раз) и "Exactly once" (ровно один раз). Эти гарантии зависят от конфигурации продюсера, брокера и потребителя, а также от настроек подтверждений (acks) и управления смещением (offset).

2️⃣ Подробное объяснение темы

Apache Kafka — это распределенная платформа потоковой передачи данных, которая обеспечивает надежную доставку сообщений между продюсерами и потребителями. Гарантии доставки в Kafka определяют, сколько раз сообщение может быть доставлено и обработано. Рассмотрим три основных уровня гарантии доставки:

  1. At most once (не более одного раза):

    • Сообщение может быть потеряно, но никогда не будет доставлено более одного раза.
    • Используется, когда важнее скорость и производительность, чем надежность доставки.
    • Пример: Продюсер отправляет сообщение без ожидания подтверждения от брокера (acks=0), а потребитель не сохраняет смещение после обработки сообщения.
  2. At least once (по крайней мере один раз):

    • Сообщение будет доставлено как минимум один раз, но может быть доставлено несколько раз.
    • Подходит для сценариев, где потеря данных недопустима, но дублирование приемлемо.
    • Пример: Продюсер ожидает подтверждение от брокера (acks=1 или acks=all), а потребитель сохраняет смещение после обработки сообщения.
  3. Exactly once (ровно один раз):

    • Сообщение будет доставлено и обработано ровно один раз.
    • Это наиболее надежная гарантия, но требует дополнительных ресурсов и конфигурации.
    • Пример: Использование транзакций Kafka, где продюсер и потребитель работают в транзакционном режиме, обеспечивая атомарность операций.

Пример конфигурации продюсера для различных гарантий

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
​
// Конфигурация для "At most once"
props.put("acks", "0"); // Продюсер не ждет подтверждения от брокера
props.put("enable.idempotence", "false"); // Идемпотентность отключена
​
// Конфигурация для "At least once"
props.put("acks", "1"); // Продюсер ждет подтверждения от лидера
props.put("enable.idempotence", "false"); // Идемпотентность отключена
​
// Конфигурация для "Exactly once"
props.put("acks", "all"); // Продюсер ждет подтверждения от всех реплик
props.put("enable.idempotence", "true"); // Идемпотентность включена
props.put("transactional.id", "my-transactional-id"); // Уникальный идентификатор транзакции
  • acks: Определяет, сколько подтверждений от брокеров должен дождаться продюсер. Значение "0" означает, что продюсер не ждет подтверждений, "1" — ждет подтверждения от лидера, "all" — ждет подтверждений от всех реплик.
  • enable.idempotence: Включает идемпотентность, что позволяет избежать дублирования сообщений.
  • transactional.id: Используется для идентификации транзакций, что необходимо для обеспечения "Exactly once" семантики.

Применение гарантий доставки

  • At most once: Используется в системах, где потеря данных не критична, например, в системах мониторинга, где важнее скорость обработки.
  • At least once: Применяется в системах, где потеря данных недопустима, например, в финансовых приложениях, где каждая транзакция должна быть учтена.
  • Exactly once: Используется в критически важных системах, где необходимо избежать дублирования и потери данных, например, в системах обработки заказов.

Понимание и правильная настройка гарантий доставки в Kafka позволяет обеспечить надежную и эффективную обработку данных в распределенных системах.

Тема: Брокеры сообщений / Streaming
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки