Apache Kafka Seriyası — Apache Kafkanın iş prinsipi necədir? Necə çalışır?

Valid Akhundov
5 min readMay 29, 2020

--

Bundan öncəki məqalələrdə Kafka və onun arxitekturası haqqında ümumi məlumat vermişdim həmin məqalələrə aşağıdan keçid edə bilərsiniz:

Seriyanın bu məqaləsində isə Kafka-nın necə işlədiyinə nəzər salacayıq. Artıq bizə məlumdur ki, Kafka ona göndərilən verilənləri saxlayır və işləyir (ötürür). Burada artıq suallar yaranmağa başlayır. Başlayaq ilk sualdan.

Kafka-ya verilənlər necə yazılır?

Kafka verilənləri bir topic altında saxlayır. Hər topic-in özünəməxsus adı vardır. Belə ki, producer əvvəlcədən məlum olan və ya yeni bir topic altında verilənləri Kafka-ya göndərir. Consumer də həmin topic altındakı verilənləri oxumaq üçün həmin topic-ə abunə olmalıdır.

Topic nədir?

Topic adı ilə identifikasiya olunan partition-lardan ibarət bir quruluşdur. Yəni əslində Kafka verilənləri Topic-ə deyil onun içindəki partition-lara yazır. Hər topic-də nə qədər partition olacağını özümüz təyin edə bilirik.

Partition nədir?

Partiton-a queue (sonuncu gələn sonuncu çıxır və ya ilk gələn ilk çıxır) kimi baxa bilərik. Yəni Kafka-ya göndərilən verilənlər göndərildiyi sıra ilə partition-a yazılır, həmin sıra ilə də consumer tərəfindən oxunur.

Qeyd edək ki, partition-dakı verilənlər disk-də saxlanılır və bu verilənlər consumer tərəfindən oxunduqdan sonra silinmir. Kafka-da verilənlərin saxlanma müddəti üçün 2 cür konfiqurasiya vardır:

  1. Zamana görə — Susmaya görə bu müddət 1 həftədir. Yəni 1 həftə sonra Kafka avtomatik olaraq topic-dəkı verilənləri siləcək. Əlbəttə bunu dəyişib öz istədiyimiz müddəti təyin edə bilərik.
  2. Yaddaşa görə — Topic-də saxlanılan verilənlərin yaddaşına görə. Tutaq ki, bu limiti 10 GB təyin etmişiksə topic-dəki verilənlərin yaddaşı 10 GB-ı keçəndə Kafka avtomatik olaraq həmin topic-dəki verilənləri siləcək.

Partition-lar nömrəsi ilə identifikasiya olunur. Hər partition-da da offset adlandırılan verilənin sıra nömrəsi vardır. Sual yarana bilər: Niyə görə topic-də bir neçə partition olur sadəcə biri ilə işləyə bilmərik? Elə isə partition-ların məqsədinə baxaq:

  1. Aggregation — Verilənlərin müəyyən kateqoriyalara görə qruplaşdırılması
  2. Event sourcing — Verilənlərin sıralanması
  3. Parallelism — Verilənlərin consumer(lər) tərəfindən daha sürətli oxunması üçün
  4. Efficiency — Verilənlərin daha optimal saxlanılması

Producer veriləni Kafka-ya göndərərkən record key adlandırılan bir key qeyd edir. Və eyni key ilə göndərilən verilənlər eyni partition-a yazılır. Əgər hər hansı bir key göndərilməzsə nə baş verir? Bu zaman Kafka susmaya görə Round-Robin adlandırılan üsulu istifadə edir. Bu üsul gələn verilənləri sıra ilə bütün partition-lara bölüşdürür.

Partition-larda replication necə baş verir?

Topic-in partition-larının hər birdən replication factor-u qədər olur. Sual yarana bilər ki, verilən eyni partition-ların hər birinəmi yazılır? Xeyr. Bu zaman leader partition seçilir və verilən ona yazılır. Və leader sinxronizasiya edərək həmin veriləni digər partition-lara göndərir. Əgər leader partition “çökərsə” o zaman digər partition leader seçiləcək. Buna leader partition election deyilir.

Producer acknowledgment nədir?

Kafka-ya verilənin yazılması 3 mərhələdən ibarətdir:

  1. Producer tərəfindən verilənin göndərilməsi
  2. Verilənin leader partition tərəfindən saxlanılması
  3. Leader partition-un veriləni digər partition-lara göndərməsi

Bu mərhələlərin hansını icra olunmasını təyin etmək üçün producer acknowledgment sazlaması vardır. Burada 3 növ sazlama var:

  1. Əgər biz istəsək ki, Kafka-ya verilən göndərilən kimi növbəti mərhələni (leader partition tərəfindən verilənin saxlanılması) gözləmədən artıq digər verilən göndərilsin bu zaman acks=0 təyin etməliyik. Bu ən sürətli və riskli seçimdir. Verilənin itirilmə ehtimalı yüksəkdir.
  2. Əgər acks=1 təyin etsək, bu zaman göndərilən verilən Kafka-ya çatacaq, leader partition-a yazılacaq daha sonra producer artıq nöbəti verilənə keçəcək. Yəni sonuncu mərhələ gözlənilməyəcək. Bu seçim orta sürətli eyni zamanda nisbətən etibarlıdır.
  3. acks=-1 (all) təyin edilərsə, bu zaman göndərilən verilənin bütün mərhələlərdən keçməsi gözlənilcək. Bu seçim ən etbarlı eyni zamanda ən aşağı sürətlidir.

Kafka-dan verilənlər necə oxunur?

Bildiyimiz kimi Kafka-dan məlumatları oxuyan proqrama consumer deyilir. Consumer Kafka-dan məlum topic altındakı veriləni oxumaq üçün ilk olaraq Kafka offset-i müəyyənləşdirməlidir. Kafka — arxitekturasından bizə məlumdur ki, bu işə ZooKeeper baxır. Consumer veriləni Kafka-dan oxuyur və artıq bu verilən ilə işinin sona çatdığını və növbəti verilənə keçmək istədiyini bildirmək üçün commit edir. Bu zaman oxunan offset ZooKeeper də qeyd edilir.

Qeyd: Kafka-nın 0.9-dan əvvəlki versiyalarında offset ZooKeeper-də saxlanılırdı lakin yeni versiyalarda artıq Kafka-nın özündə “__consumer_offsets” adlı topic-də saxlanılır.

Verilənlər Kafka-dan bir neçə strategiya ilə oxuna bilər:

At most once — Bir dəfə oxuyur və həmin an commit edir. Daha sonra həmin verilən işlənir. Ona görə ən çox bir dəfə adlandırılır ki, oxuyan kimi commit edilir və artıq offset yenilənir. Eyni verilənin oxunması ehtimalı qalmır.

At least once — Veriləni oxuyur, işləyir sonda commit edir. Ən az bir dəfə adlandırılmasının səbəbi isə odur ki, əgər verilən işlənən zaman problem yaransa commit edilmədiyi üçün offset-də yenilənməyib və consumer yenidən oxumağa başlasa eyni verilən təkrar oxunacaq.

Exactly once — Consumer veriləni oxuyandan sonra bir tranzaksiya başladır və bu tranzaksiya bitəndə commit edilir. Hər hansı bir problem baş verdikdə belə tranzaksiya daxilində həmin verilən saxlanıldığı üçün verilən itmir.

Consumer qrupu nədir?

Consumer-lər bir qrup şəklində olur və bu qrup “group id” ilə identifikasiya olunur. Hər consumer bir qrupa aiddir. Eyni group id-li consumer-lər bir qrup altında cəmləşir. Kafka topic-dəki partition-ları qrupdakı consumer-lər arasında bölüşdürür. Bu zaman verilənlərin paralel oxunması baş verir və nəticədə oxunma prosesi sürətlənir. Eyni qrup daxilində fərqli consumer-lər eyni partition-lardan oxuya bilməz. Aşağıdakı şəkildə gördüyümüz kimi yeni bir topic-ə 3 fərqli consumer qrupu abunə olub.

  • Consumer qrup 1 — Consumer sayı partition sayından az olduğu üçün Kafka maksumum optimal şəkildə bölüşdürmə edib və sonda bir consumer birdən çox partition-dan oxuyur.
  • Consumer qrup 2 — Consumer və partition bərabər sayda olduğu üçün tam paralellik təmin olunub. Hər consumer bir partition-dan oxuyur.
  • Consumer qrup 3 — Consumer-lərin sayı partition-lardan çox olduğu üçün boşda qalan consumer vardır. Və o hazırda məşğul olan hər hansı consumer əlaqəni kəsərsə o zaman onun yerini alacaq.

Bu məqalədə Kafka-nın iş prinsipinə, verilənlərin Kafka-ya necə yazılması və oxunmasına nəzər saldıq. Növbəti məqalə Kafka-nın ənənəvi üsulla və Docker-də qurulması barədə olacaq. Artıq yuxarıda qeyd etdiyimiz sazlamaları praktiki olaraq tətbiq edəcəyik. İzləmədə qalın, növbəti məqaləyədək!

--

--