Kafka ilə işləyən əksər komandalar üçün partisiya strategiyası seçmək adətən sonradan problem yaradana qədər diqqətdən kənarda qalır. Aşağı həcmdə topic problemsiz işləyir, ancaq trafik artdıqca geridə qalmış eventlər, pozulmuş sıralama, bir konsumerin boğulması kimi hallar ortaya çıxır. Bütün bunların kökündə isə partisiya qərarı dayanır – çox vaxt dəyişdirilməsi bahalı olan bir qərar.
Partisiyalar paralelliyin vahididir
Hər bir konsumer qrupu müəyyən partisiyaları təkbaşına emal edir – iki konsumer eyni partisiyanı paylaşa bilməz. Yəni partisiya sayı konsumer qrupunun maksimum paralelliyini təyin edir: 6 partisiyanız varsa, 7-ci konsumer boş qalacaq. Eyni zamanda, sıralamaya da partisiya səviyyəsində nəzarət edilir: bir partisiya daxilində eventlər ciddi ardıcıllıqla işlənir, amma partisiyalar arasında heç bir zəmanət yoxdur. Doğru açar seçilməyibsə, eyni istifadəçinin hadisələri sıradan çıxa bilər.
Açar əsaslı partisiya – ən geniş yayılmış strategiya
Sıralama vacibdirsə, standart yanaşma açar əsaslı partisiyadır. Siz event göndərərkən açar təqdim edirsiniz, Kafka onu murmur2 alqoritmi ilə heşləyir və partisiya sayına bölərək hədəfi təyin edir. Eyni açar həmişə eyni partisiyaya düşür – bu da həmin açar daxilində sıralamanı qoruyur. Problem isə açar paylanmasındadır. Məsələn, ölkə kodundan açar kimi istifadə etsəniz və trafikin 80%-i bir ölkədən gəlirsə, 80% event eyni partisiyada toplanar, həmin konsumer boğular, qalanları boş qalar. Yüksək kardinallıqlı açarlar (user_id, order_id, device_id) daha yaxşı paylanır.
Heç bir açar təqdim etməsəniz, Kafka eventləri bərabər paylayır – sıralama qurban verilir, amma ötürmə qabiliyyəti yaxşı olur. Loglar, metrikalar kimi sıralamanın əhəmiyyətsiz olduğu hallar üçün uyğundur. Kafka 2.4'dən etibarən “sticky partitioning” adlı mexanizm tətbiq edir, yəni partisiyalar arasında tez-tez keçmək əvəzinə batch-lər dolana qədər eyni partisiyada qalır – bu daha səmərəlidir.
Xüsusi partisionerlər və “hot partition” problemi
Bəzən standart strategiyalar kifayət etmir, öz partisionerinizi yazmalı olursunuz. Coğrafi marşrutlaşdırma, müştəri səviyyələri və ya uyğunluq tələbləri üçün dar çərçivədə faydalı ola bilər. Amma bunu yalnız məcbur olduqda etmək məsləhətdir – məntiq istehsalçı kodunda yaşayır, hər dəyişiklik yenidən yerləşdirmə tələb edir, növbəti mühəndis bu kodu öyrənməli olur.
“Hot partition” – bir partisiyanın qalanlarından çox daha çox yük daşımasıdır. Bu, konsumerin geridə qalmasına, gecikmə artımına səbəb olur. Təcrübədə, bir komanda orta konsumer lag-ına baxdığı üçün problemi iki gün hiss etməmişdi – 12 partisiyadan biri 60% trafiki daşıyırdı, amma ümumi rəqəmlər normal görünürdü. Kök səbəb adətən qeyri-bərabər paylanan açarlardır (region, status, timestamp). Həll yolu: açara təsadüfi şəkilçi əlavə etmək (sıralama pozulur), xüsusi partisioner, və ya istehlakçı tərəfdə yenidən sıralama. Ən yaxşısı bunu istehsalatdan əvvəl aşkarlamaqdır – nümunə götürüb hər partisiyaya düşən yükü simulyasiya edin.
Partisiya sayını dəyişdirmək təhlükəli ola bilər
Mövcud topic üçün partisiya sayını artırmaq mümkündür, azaltmaq isə yox. Və artırmaq heç də həmişə təhlükəsiz deyil – açarın düşdüyü partisiya heş(key) % partition_count düsturu ilə hesablandığı üçün say dəyişəndə bütün açarların ünvanı dəyişir. Bir komanda 6 partisiyadan 12-yə keçəndə, vəziyyətli konsumerin yaddaşındakı məlumatlar yanlış oldu – çünki köhnə partisiyadakı istifadəçilər artıq başqa yerdə idi. Daha təhlükəsiz yol: yeni bir topic yaradın, hər iki topic'ə yazın, köhnəni boşaldın, sonra söndürün. Stateless topic-lərdə risk aşağıdır, amma bu fərziyyəni sənədləşdirmək vacibdir.
Ən kritik göstərici: orta lag deyil, hər partisiya üzrə ayrı-ayrı lag. Partisiya ölçülərində qeyri-bərabərlik də açar əyilməsinin əlamətidir. Rebalans tezliyi də izlənilməlidir – həddindən artıq rebalans varsa, yəqin ki, bir partisiya konsumeri yorur. Bu metrikalar Kafka'nın JMX interfeysindən Prometheus və Confulent vasitələri ilə izlənə bilər.
Xülasə: partisiya qərarını topic yaradılmamışdan əvvəl verin. Sıralama vacibdir? Açar lazımdır. Həqiqi trafikdə açar paylanması necədir? Paralel olaraq neçə konsumer işlədəcəksiniz? Cavab partisiya sayınız olsun – ilkin sayı 2-3 dəfə artırıb, bir illik böyüməni nəzərə alın. Qərarınızı sənədləşdirin. Article-dəki bütün insidentlərin qarşısını almaq olardı – sadəcə 10 dəqiqə düşünmək kifayətdir. Səhvi sonradan düzəltmək günlər çəkir.



