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

Что такое гарантия доставки у брокера сообщений

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

Гарантия доставки у брокера сообщений — это механизм, обеспечивающий надежную передачу сообщений между отправителем и получателем. Существует три основных уровня гарантии: "At most once" (сообщение может быть потеряно, но не будет доставлено более одного раза), "At least once" (сообщение будет доставлено как минимум один раз, но возможно дублирование) и "Exactly once" (сообщение будет доставлено ровно один раз).

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

Гарантия доставки — это ключевая концепция в системах обмена сообщениями, таких как брокеры сообщений (например, Apache Kafka, RabbitMQ, ActiveMQ). Она определяет, как система обрабатывает сообщения и как она справляется с возможными сбоями в процессе доставки.

Уровни гарантии доставки

  1. At Most Once (Не более одного раза):

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

    • Сообщение будет доставлено как минимум один раз, но возможно дублирование.
    • Подходит для критически важных сообщений, где потеря недопустима, но дублирование может быть обработано.
    • Пример: финансовые транзакции, где важно, чтобы операция была выполнена, даже если это приведет к повторной обработке.
  3. Exactly Once (Ровно один раз):

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

Как это работает

Брокеры сообщений используют различные механизмы для обеспечения этих уровней гарантии:

  • Подтверждения (Acknowledgments): Получатель отправляет подтверждение отправителю после успешного получения сообщения. Это позволяет отправителю знать, что сообщение доставлено.

  • Повторная отправка (Retries): Если подтверждение не получено, сообщение может быть отправлено повторно. Это помогает в реализации "At least once" гарантии.

  • Идентификаторы сообщений (Message IDs): Используются для отслеживания сообщений и предотвращения их дублирования, что важно для "Exactly once" гарантии.

Пример кода

Рассмотрим пример использования Apache Kafka для реализации "At least once" гарантии:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all"); // Гарантия, что все реплики подтвердят получение
​
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
​
try {
    for (int i = 0; i < 10; i++) {
        producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), "message-" + i)).get(); // Блокирующий вызов для получения подтверждения
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    producer.close();
}
  • props.put("acks", "all");: Устанавливает уровень подтверждения, требуя, чтобы все реплики подтвердили получение сообщения, что обеспечивает "At least once" гарантию.
  • producer.send(...).get();: Использует блокирующий вызов, чтобы дождаться подтверждения от брокера, что сообщение было получено и записано.

Гарантия доставки — это важный аспект проектирования надежных систем обмена сообщениями, который позволяет обеспечить целостность и надежность передачи данных в распределенных системах.

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

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

Твои заметки