🙏 Kafka #5: Сегменты и индексы. Как брокер указывает консьюмеру на своё место?
Кажись у меня появилась энергия даже на такую душную тему, как кафка.
Мы в прошлый раз изучали, как устроено хранение данных на брокере – сегменты и партиции. Теперь рассмотрим, как брокер управляется с этим добром и как консьюмер общается с брокером.
🚸 Начнем с того, что кафка работает по TCP и использует свой бинарный протокол. Как он работает?
1️⃣ Когда консьюмер подключается к брокеру, он посылает в него запрос на поиск нужного оффсета: void seek(TopicPartition, offset). Есть еще seekToBeginning или seekToEnd, они работают почти так же, только ищут по времени, а не по оффсету.
2️⃣ Брокер находит нужный оффсет.
3️⃣ Консьюмер вызывает метод poll(timeout) и начинает консьюмить.
(Пояснительный дикпик 1)
🅰️ Как брокер быстро находит нужный оффсет? Понятное дело по индексу. Обычно индекс кажется загадочной структурой, которая магически ускоряет всё в этой жизни, но на деле это тупо файл.
Мне проще разбирать штуки на конкретных примерах, поэтому представим, что нам пришел запрос seek() с параметрами TopicPartition = "configured-topic-0" и offset = 1.
1️⃣ Сначала по имени партиции находим нужную папку.
2️⃣ Потом в нужной папке находим файл с индексом.
3️⃣ В файле индекса находим нужный offset.
4️⃣ В файле сегмента находим нужное сообщение по offset.
(Пояснительный дикпик 2)
Так и работают индексы в кафке. Индексы по времени устроены так же, только мы лезем в файл с расширением .timeindex.
Мне было прикольно во всем этом разобраться, но возможно я где-то накосячил. Так что не стесняйтесь в комментариях или личке писать мне всякие критические доводы по этому посту. А в следующий раз я думаю разобрать механизмы реплицирования топиков.
#kafka
Post #115
113
- 🔥 1