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

Что такое partition, offset, commit и retention?

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

Partition — это логическое деление топика в Apache Kafka, позволяющее распределять данные и обрабатывать их параллельно. Offset — уникальный идентификатор сообщения в партиции, используемый для отслеживания порядка сообщений. Commit — процесс сохранения текущего offset, чтобы потребитель мог продолжить чтение с этого места после перезапуска. Retention — политика хранения сообщений в Kafka, определяющая, как долго сообщения остаются в системе.

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

Apache Kafka — это распределенная платформа потоковой передачи данных, которая позволяет публиковать и подписываться на потоки записей, аналогично очередям сообщений. Чтобы понять, как Kafka управляет данными, важно разобраться в таких понятиях, как partition, offset, commit и retention.

Partition

Partition — это способ логического деления топика в Kafka. Каждый топик может быть разделен на несколько партиций, что позволяет распределять данные и обрабатывать их параллельно. Это обеспечивает масштабируемость и высокую производительность. Например, если у вас есть топик с именем "user-logs", он может быть разделен на три партиции: "user-logs-0", "user-logs-1" и "user-logs-2". Каждая партиция хранит часть данных топика и может обрабатываться независимо.

Offset

Offset — это уникальный идентификатор для каждого сообщения в партиции. Он представляет собой порядковый номер, который Kafka присваивает каждому сообщению в момент его записи в партицию. Offset позволяет потребителям отслеживать, какие сообщения они уже обработали. Например, если потребитель прочитал сообщения с offset 0, 1 и 2, он знает, что следующее сообщение, которое нужно обработать, имеет offset 3.

Commit

Commit — это процесс сохранения текущего offset, который потребитель использует для отслеживания своего прогресса в чтении сообщений из партиции. Когда потребитель обрабатывает сообщение, он может зафиксировать (commit) offset, чтобы в случае сбоя или перезапуска начать чтение с этого места. Это предотвращает повторную обработку уже прочитанных сообщений. В Kafka commit может быть выполнен автоматически или вручную, в зависимости от настроек потребителя.

Retention

Retention — это политика хранения сообщений в Kafka, определяющая, как долго сообщения остаются в системе. Retention может быть настроен по времени (например, хранить сообщения в течение 7 дней) или по размеру (например, хранить до 100 ГБ данных). После истечения периода хранения или превышения лимита размера старые сообщения удаляются. Это позволяет управлять объемом данных, хранящихся в Kafka, и предотвращает переполнение дискового пространства.

Пример кода для иллюстрации работы с offset и commit:

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
​
public class KafkaConsumerExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "test-group");
        props.put("enable.auto.commit", "false"); // Отключаем автоматический commit
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
​
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singletonList("user-logs"));
​
        try {
            while (true) {
                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
                for (ConsumerRecord<String, String> record : records) {
                    System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
                    // Обработка сообщения
                }
                consumer.commitSync(); // Ручной commit offset после обработки сообщений
            }
        } finally {
            consumer.close();
        }
    }
}
  • props.put("enable.auto.commit", "false"); — отключает автоматический commit, чтобы управлять этим процессом вручную.
  • consumer.poll(Duration.ofMillis(100)); — извлекает сообщения из топика, ожидая до 100 миллисекунд.
  • System.out.printf(...) — выводит offset, ключ и значение каждого сообщения.
  • consumer.commitSync(); — выполняет синхронный commit offset после обработки всех сообщений в текущей итерации цикла.

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

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

Твои заметки