Какие знаешь гарантии доставки в Kafka
1️⃣ Как кратко ответить
В Kafka существуют три основные гарантии доставки: "At most once" (не более одного раза), "At least once" (по крайней мере один раз) и "Exactly once" (ровно один раз). Эти гарантии зависят от конфигурации продюсера, брокера и потребителя, а также от настроек подтверждения (acks) и обработки смещений (offsets).
2️⃣ Подробное объяснение темы
Apache Kafka — это распределенная платформа потоковой передачи данных, которая обеспечивает высокую производительность и надежность. Одной из ключевых характеристик Kafka является ее способность гарантировать доставку сообщений. В зависимости от требований приложения, Kafka может обеспечить различные уровни гарантии доставки сообщений.
Гарантии доставки
-
At most once (не более одного раза)
В этом режиме сообщения могут быть потеряны, но никогда не будут доставлены более одного раза. Это может произойти, если продюсер отправляет сообщение, но не получает подтверждение от брокера и не пытается повторно отправить сообщение. Этот режим подходит для сценариев, где потеря данных допустима, но дублирование недопустимо.
Пример конфигурации:
- Продюсер:
acks=0(не ждать подтверждения от брокера) - Потребитель: Автоматическое смещение (offset) после получения сообщения
- Продюсер:
-
At least once (по крайней мере один раз)
В этом режиме сообщения гарантированно будут доставлены, но могут быть доставлены более одного раза. Это достигается за счет повторной отправки сообщений продюсером, если подтверждение от брокера не было получено. Потребитель должен быть готов обрабатывать дублирующиеся сообщения.
Пример конфигурации:
- Продюсер:
acks=all(ждать подтверждения от всех реплик) - Потребитель: Явное подтверждение обработки сообщения перед смещением
- Продюсер:
-
Exactly once (ровно один раз)
Этот режим гарантирует, что каждое сообщение будет доставлено и обработано ровно один раз. Это наиболее сложная гарантия, требующая координации между продюсером, брокером и потребителем. Kafka поддерживает эту гарантию через транзакции и идемпотентные продюсеры.
Пример конфигурации:
- Продюсер: Включение идемпотентности (
enable.idempotence=true) - Использование транзакций для атомарной записи и обработки сообщений
- Продюсер: Включение идемпотентности (
Как это работает
-
Продюсер: Отправляет сообщения в Kafka. Настройки подтверждений (acks) определяют, сколько реплик должны подтвердить получение сообщения. Это влияет на надежность доставки.
-
Брокер: Хранит сообщения и управляет их репликацией. Гарантии доставки зависят от того, как брокер обрабатывает подтверждения и репликацию.
-
Потребитель: Читает сообщения из Kafka. Управление смещениями (offsets) определяет, какие сообщения уже были обработаны. Это важно для обеспечения корректной обработки сообщений.
Пример кода
package main
import (
"fmt"
"log"
"github.com/Shopify/sarama"
)
func main() {
// Создаем конфигурацию продюсера
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll // Ждем подтверждения от всех реплик
config.Producer.Retry.Max = 5 // Максимальное количество попыток повторной отправки
config.Producer.Idempotent = true // Включаем идемпотентность для exactly once
// Создаем нового синхронного продюсера
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
if err != nil {
log.Fatalln("Failed to start producer:", err)
}
defer producer.Close()
// Создаем сообщение
msg := &sarama.ProducerMessage{
Topic: "example-topic",
Value: sarama.StringEncoder("Hello, Kafka!"),
}
// Отправляем сообщение
partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Fatalln("Failed to send message:", err)
}
// Выводим информацию о доставке
fmt.Printf("Message is stored in partition %d, offset %d\n", partition, offset)
}
- Создание конфигурации продюсера: Устанавливаем
RequiredAcksвWaitForAll, чтобы ждать подтверждения от всех реплик, и включаем идемпотентность для обеспечения exactly once доставки. - Создание продюсера: Создаем нового синхронного продюсера с заданной конфигурацией.
- Создание сообщения: Определяем сообщение, которое будет отправлено в Kafka.
- Отправка сообщения: Используем метод
SendMessageдля отправки сообщения и получаем информацию о его размещении. - Вывод информации: Печатаем информацию о том, в какой раздел и с каким смещением было сохранено сообщение.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться