Что такое гарантия доставки у брокера сообщений
1️⃣ Как кратко ответить
Гарантия доставки у брокера сообщений — это механизм, обеспечивающий надежную передачу сообщений между отправителем и получателем. Существует три основных уровня гарантии: "At most once" (сообщение может быть потеряно, но не будет доставлено более одного раза), "At least once" (сообщение будет доставлено как минимум один раз, но возможно дублирование) и "Exactly once" (сообщение будет доставлено ровно один раз).
2️⃣ Подробное объяснение темы
Гарантия доставки — это ключевая концепция в системах обмена сообщениями, таких как брокеры сообщений (например, Apache Kafka, RabbitMQ, ActiveMQ). Она определяет, как система обрабатывает сообщения и как она справляется с возможными сбоями в процессе доставки.
Уровни гарантии доставки
-
At Most Once (Не более одного раза):
- Сообщение может быть потеряно, но не будет доставлено более одного раза.
- Используется в случаях, когда потеря сообщения не критична.
- Пример: уведомления о состоянии системы, где важнее не перегружать систему дублирующимися сообщениями.
-
At Least Once (Как минимум один раз):
- Сообщение будет доставлено как минимум один раз, но возможно дублирование.
- Подходит для критически важных сообщений, где потеря недопустима, но дублирование может быть обработано.
- Пример: финансовые транзакции, где важно, чтобы операция была выполнена, даже если это приведет к повторной обработке.
-
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();: Использует блокирующий вызов, чтобы дождаться подтверждения от брокера, что сообщение было получено и записано.
Гарантия доставки — это важный аспект проектирования надежных систем обмена сообщениями, который позволяет обеспечить целостность и надежность передачи данных в распределенных системах.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться