🙏
Kafka #3: Как устроен Topic. Партиции.Ок, топик мы создали, начали писать туда сообщение и вдруг поняли, что тачка не вывозит. Что делать? На помощь приходят партиции. Топик состоит из партиций
(пояснительный дикпик 1).
Как данные пишутся в партиции?Сдуру можно подумать, что когда сообщение приходит в топик, оно будет класться в обе партиции, и типа это поможет. Но не надо так думать, потому что если так сделать, то это будет бессмысленно. Давайте пару минут подумаем, почему... Раз... Два... Ладно, дело в том, что если вы будете копировать все сообщения, то нагрузка будет одинаковой на обе партиции, и если одна в огне, то и вторая в оггне.
Соотвественно
сообщения по партициям не копируются, а распределяются!Когда продьюсер шлет сообщение в топик, продьюсер должен указать ключ (номер) партиции, в которую он собирается писать сообщение.
Ключи для партиций должны генерироваться продьюсером так, чтобы данные по одной сущности лежали в одной партиции. К примеру по id сущности.
Partition0: 1️⃣1️⃣1️⃣1️⃣1️⃣
Partition1: 2️⃣2️⃣2️⃣2️⃣2️⃣2️⃣
Каждая партиция может храниться на разных брокерах
(пояснительный дикпик 2). А значит ваши сообщения могут принимать не одна, а две машины. Вот вам и параллелизация.
Как данные читаются из партиции?Хорошо, мы научились писать в партиции, а как же из них читать? Это не так просто, ибо партиция, это по сути отдельно живущая штука. Что-то типа сетевой папки.
Из одного топика могут читать сколько угодно консьюмер-
групп (
пояснительный дикпик). Но вот из одной партиции может читать только один консьюмер! Один, в рамках одной консьюмер-группы, разумеется 🖼, как меня правильно поправили в комментариях.
(п
ояснительный дикпик 3).
Из этого пункта следует два вывода:
❗️
Сколько партиций, столько и консьюмеров в группе – ни больше ни меньше. Потому что, если сделаете меньше, то часть событий просто пролетит мимо вас. А если сделаете больше, то лишний консьюмер будет стоять и передергивать в сторонке. (на третьем дикпике мы как раз аидим таког третьего лишнего)
❗️Если продьюсер не указал ключ партиции, то сообщение распределится между партициями по RoundRobin'у. То есть вот так:
Partition0: 1️⃣1️⃣2️⃣1️⃣2️⃣
Partition1: 2️⃣1️⃣2️⃣2️⃣1️⃣2️⃣
И вам потом придется бегать по партициям и собирать все во что-то более менее приемлемое. Так что будьте с этим аккуратнее.
🅰️
Практические выводы: 1. Когда делаете новый топик, то сразу думаете про количество партиций. Думаю, что стоит считать предполагаемую нагрузку по сообщениям. Так как добавление партиций –
это нетривиальная операция. Короче, это число с бухты-барахты не выбирают.
(у нас в компании вот выбрали по лунному календарю и гороскопу, но не с бухты-барахты блять!) 2. Продьюсер должен задавать ключ партиции. Иначе в партициях будет хаос из данных по разным сущностям.
(но хер знает, может вы носитель хаоса, и вам так комфортнее 😉)Дисклеймер: Вся информация здесь, это моя личная вольная интерпретация прочитанной доки по кафке, просмотренных видосов и разговоров с коллежанами. Если у вас есть возражения, то приносите их в комменты. Я очень благодарен всем, кто комментирует, лайкает и вообще проявляет активность в канале и в личке. Это супер-помогает мне не терять мотивацию!#kafka