TGViewer
C# Short Posts 🔞 C# Short Posts 🔞 @dimasshortposts · 309 subscribers
Post #102 65
🙏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
  • 🔥 4
More from @dimasshortposts
  1. Oct 2, 2026s
  2. Oct 2, 2026Post #503
  3. Sep 30, 2026🛤 Путь до Tier1: от чего он зависит В прошлый раз мы гоняли hello world в цикле и увидели…
  4. Sep 26, 2026🧵 Тредик для вопросов по докладу про MAF на дотнексте В докладе многие подробности опусти…
  5. Sep 23, 2026Даже самым хардкорным ребятам надо отдыхать, так что отдыхаем, мои чюваки 🕺 🧑‍💻dp🥁 #he…
  6. Sep 16, 2026🎯 Instrumented Tier0: профилирование кода В прошлый раз мы разобрали два уровня компиляци…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →