Ответ
Apache Kafka — это распределённая стриминговая платформа, которая оперирует следующими ключевыми абстракциями:
-
Topic (Топик) — именованный поток сообщений. Продюсеры отправляют сообщения в топики, а консьюмеры их оттуда читают. Например, топик
user-registrationsилиorder-updates. -
Partition (Партиция/Раздел) — основная единица параллелизма в Kafka. Каждый топик делится на одну или несколько партиций. Сообщения внутри одной партиции упорядочены и неизменяемы, но порядок между разными партициями не гарантируется. Каждое сообщение в партиции имеет свой
offset. -
Offset (Смещение) — уникальный последовательный номер, который Kafka присваивает каждому сообщению в партиции. Он идентифицирует позицию сообщения. Консьюмеры отслеживают свой
offset, чтобы знать, какие сообщения они уже прочитали. -
Producer (Продюсер) — приложение, которое публикует (отправляет) сообщения в топики Kafka. Пример отправки сообщения с использованием библиотеки
saramaв Go:producer, err := sarama.NewSyncProducer(brokers, config) // ... msg := &sarama.ProducerMessage{ Topic: "orders", Key: sarama.StringEncoder("order_id_123"), Value: sarama.StringEncoder("{"status": "created"}"), } partition, offset, err := producer.SendMessage(msg) -
Consumer (Консьюмер) — приложение, которое подписывается на один или несколько топиков и читает из них сообщения.
-
Consumer Group (Группа потребителей) — одна или несколько консьюмеров, которые совместно обрабатывают сообщения из топика. Kafka гарантирует, что каждая партиция топика будет обрабатываться только одним консьюмером из группы. Это позволяет масштабировать обработку сообщений, запуская больше экземпляров консьюмера в одной группе.
-
Broker (Брокер) — сервер Kafka. Кластер Kafka состоит из одного или нескольких брокеров. Брокеры хранят данные (партиции топиков) и обслуживают запросы от продюсеров и консьюмеров.
-
Replica (Реплика) — копия партиции, хранящаяся на другом брокере для обеспечения отказоустойчивости. Для каждой партиции есть одна leader-реплика (обслуживает все запросы на чтение и запись) и ноль или более follower-реплик (пассивно копируют данные с лидера). Если лидер выходит из строя, один из фолловеров становится новым лидером.
Ответ 18+ 🔞
А, слушай, смотри, вот эта ваша Кафка, блядь... Ну, распределённая стриминговая платформа, ёпта. Не пугайся, щас разжуёшь. У неё там есть свои ключевые штуки, как в хорошем анекдоте — без них нихуя не понятно.
Первое — Topic (Топик). Это типа именованный поток сообщений, как очередь в столовой, только для данных. Один чувак (продюсер) туда запихивает сообщения, а другой (консьюмер) их оттуда выковыривает. Например, топик user-registrations — туда падают все, кто зарегался, а топик order-updates — там про заказы. Всё просто, как три копейки.
Дальше — Partition (Партиция/Раздел). Вот тут начинается магия, блядь. Каждый топик можно нарезать, как колбасу, на несколько кусков — партиций. Это чтобы не одним потоком всё лилось, а параллельно, понимаешь? Сообщения внутри одного куска идут строго по порядку, как солдаты на параде, а между разными кусками — хуй его знает, порядок не гарантируется. В каждой партиции у каждого сообщения есть свой номерок — Offset (Смещение). Это как талончик в очереди, только наоборот — он говорит, какое по счёту это сообщение в этой конкретной партиции. Консьюмер смотрит на этот оффсет и понимает, что он уже прочитал, а что ещё нет. Гениально, ёпта!
Producer (Продюсер) — это тот самый чувак, который пишет в топик. Вот, смотри, как он это делает на Go с библиотекой sarama:
producer, err := sarama.NewSyncProducer(brokers, config)
// ...
msg := &sarama.ProducerMessage{
Topic: "orders",
Key: sarama.StringEncoder("order_id_123"),
Value: sarama.StringEncoder("{"status": "created"}"),
}
partition, offset, err := producer.SendMessage(msg)
Отправил — и всё, сообщение улетело в нужную партицию, и ему даже сказали, в какую именно и какой у него оффсет. Красота!
А Consumer (Консьюмер) — это обратная сторона медали. Он подписывается на топик и начинает эти сообщения читать. Но если консьюмеров много, то чтобы они друг другу не мешали и не читали одно и то же по десять раз, их объединяют в Consumer Group (Группу потребителей). Это, блядь, ключевая вещь! Кафка гарантирует, что каждая партиция топика будет обрабатываться только ОДНИМ консьюмером из группы. Хоть десять консьюмеров запусти — они между собой партиции поделят, как мужики в бане полки. Это и есть масштабирование, ёбана!
Broker (Брокер) — это просто сервер Кафки, железяка такая. Их в кластере обычно несколько, чтобы если один накрылся медным тазом, другие работали. Брокеры хранят данные — те самые партиции топиков.
И наконец, Replica (Реплика) — это для надёжности, чтоб не потерять данные, если брокер возьмёт и откинет копыта. Для каждой партиции есть одна leader-реплика — она главная, все читают и пишут только у неё. А ещё есть follower-реплики — они тупо копируют данные с лидера. Если лидер сдохнет, один из фолловеров станет новым лидером. Отказоустойчивость, ёпта, в рот меня чих-пых!
Вот и вся система, не так страшен чёрт, как его малюют. Главное — партиции, оффсеты и группы консьюмеров запомнить, а остальное — технические детали.