Xabar navbatlari: RabbitMQ, Kafka
Xabar navbatlari: RabbitMQ, Kafka
1) Qachon nimani tanlash
RabbitMQ (AMQP 0-9-1 / 1. 0, klassik navbatlar, Quorum Queues, Streams)
Quyidagilar uchun mos keladi: RPC/buyruqlar, workflow, qisqa vazifalar, fanout/topic marshrutlash, moslashuvchan tasdiqlash, ustuvorliklarni boshqarish.
Ijobiy tomonlari: marshrutlashning boy semantikasi (exchanges),’basic. qos’(prefetch), per-message TTL/delay, qulay RPC (reply-to) patternlari, oson ishga tushirish.
Kamchiliklar: tarix navbatda saqlanadi, navbatlar/shardlar bo’yicha gorizontal masshtablash; juda katta oqimlarda yuqori Throughput-qiymat.
Apache Kafka (voqealar jurnali, partiyalar, consumer groups)
Quyidagilar uchun mos keladi: voqealar oqimi, audit, event sourcing, ETL/integratsiyalar (Connect), yuqori RPS/MBps, replay/re-protsessing, strim-protsessing (Streams/ksqlDB).
Afzalliklari: uzoq muddatli jurnal, partitsiyalar bo’yicha kattalashtirish, barqaror reple, kalitlarni ixcham qilish.
Minuslar: «pull + partiya» modeli - kichik RPC uchun emas; tartib faqat partiya doirasida; sxemalarni/muvofiqlikni boshqarish - jamoaning majburiyati.
2) Yetkazib berish semantikalari va invariantlar
At-most-once: retrajsiz; tez, yo’qotish xavfi.
At-least-once: retralar bilan; iste’molchining idempotentligini talab qiladi.
Exactly-once: cheklangan sharoitlarda erishish mumkin (Kafka TX + idempotent prodyuser + kelishilgan sink; RabbitMQ - dedup jadvali/idempotent kalitlari orqali).
Tartib: RabbitMQ - navbat tartibi (retralar/ko’p konsumerlarda buzilishi mumkin); Kafka - partiyada tartib, partiyalashning kalitidir.
Domen invariantlari: pul/balanslar - jurnallar/dostonlar va idempotent buyruqlar orqali; LWWga tayanmang.
3) Integratsiya patternlari
Outbox/InBox: hodisani DB → ga atomik yozib qo’yish (outbox) va empotent iste’mol qilish (inbox).
DLQ (o’lik xatlar): N urinishlar/xatolardan keyin - DLQ + alertga.
Retry/Delay: RabbitMQ — TTL + dead-letter exchange; Kafka - backoff bilan retry-topiklar.
Request/Reply: RabbitMQ — `reply_to` + `correlation_id`; Kafka - kamdan-kam hollarda, faqat maxsus patternlar bilan.
Kompensatsiyalar: voqealar ustidagi dostonlar; har bir operatsiya teskari bo’ladi.
4) Kalitlar va topologiyalarni loyihalash
RabbitMQ
Exchanges: `direct`, `topic`, `fanout`, `headers`.
Routing key: navbat (lar) ni aniqlaydi. Ustuvorlik uchun - alohida navbatlar.
QoS:’prefetch’(masalan, 50-300) tezlik/latentlikni muvozanatlaydi.
Quorum Queues: Raft uchun takrorlanadigan navbatlar; mirrored classic almashtirish.
Streams: high-throughput/replay uchun ofset oqimi (Kafka kabi).
Kafka
Topic → partitions:’#partitions’ni maqsadli throughput va parallelizm bo’yicha rejalashtiring.
Key: bitta kalitning barcha yozuvlari bitta partiyada (kalit tartibining kafolati).
Replication factor: 3 uchun samarali mavzular,’min. insync. replicas = 2’+’acks = all’ishonchlilik uchun.
Retention: vaqt/oʻlcham boʻyicha; compaction - oʻchirish uchun + tombstones kaliti boʻyicha oxirgi qiymatlarni saqlaydi.
5) Retrai, DLQ, idempotentlik
RabbitMQ
Takrorlash: per-message TTL + DLX (dead-letter exchange) bilan backoff (masalan, 1m → 5m → 15m).
Idempotentlik:’correlation _ id ’/’ message-id’+ qayta ishlangan xabarlar jadvali (TTL) yoki determinizatsiya qilingan buyruqlar.
Tasdiqlash: manual’basic. ack’muvaffaqiyatli tranzaksiyadan keyin;’basic. nack(requeue=false)` в DLQ.
Kafka
Takrorlar: alohida retry-topiklar; consumer muvaffaqiyatli side-effect.
Exactly-once processing (EOS): Producer `enable. idempotence = true’, tranzaksion producer/consumer,’read _ committed’iste’molchida; sink (masalan, Kafka → Kafka yoki Kafka → DB tranzaksiya orqali) - ehtiyotkorlik bilan sinxronlashtirish.
Dedup: baza tomonida yoki compacted topic orqali.
6) Unumdorlik va o’lchash
Littl qonuni: ’L = λ × W ’
Vorkerlar uchun: talab etiladigan parallellik’N zaxirasi (1. 2–1. 5)`.
RabbitMQ prefetch:’prefetch = 100’bilan boshlang va p99/in-flight vaqtini o’lchang.
Kafka partitions: istalgan consumer-parallelizm va throughput maqsadlari hisobi (masalan, SSD/10GbE uchun 1 partiya barqaror 5-20 MB/s).
7) Kuzatish va alertlar
Umumiy:- Lag/Backlog (xabarlar/bayt), age xabarlar (p95/p99), error-rate ishlanmalar, DLQ-rate.
- «Nashr → qayta ishlash» (end-to-end) vaqti.
- Qaramlik xaritasi: prodyuser → broker → konsumer.
- Ulanishlar, kanallar,’memory _ alarm’,’disk _ free _ limit’,’queue length’p95.
- Quorum bo’yicha hisobotlar (leader, Raft log, xatolar’quorum not enough’).
- Under-replicated partitions, ISR shrink/expand, controller changes.
- Producer errors (timeouts, `request latency`), consumer lag per group/partition.
- Broker I/O, page cache hit, GC, ZooKeeper/KRaft health.
8) Xavfsizlik va ko’p tenantlik
TLS in-transit shifrlash, autentifikatsiya (SASL/PLAIN/SCRAM/OAuth, mTLS).
Avtorizatsiya: vhost/permissions (RabbitMQ), topiklar/guruhlar uchun ACL (Kafka).
Kvotalar: ulanishlar, kanallar, navbat/topika hajmi, nashr etish/o’qish tezligi.
Chorshanba (dev/stage/prod) va namespace/vhost bo’yicha izolyatsiya.
9) Ekspluatatsiya va tyuning
RabbitMQ
Uzellarga (CPU/IO kapatsiteti) exchanges/queues tarqating.
Katta buferlar uchun Lazy queues (disk xabarlari); shardingsiz «issiq» navbatlardan qoching.
HA uchun Quorum Queues; Raft jurnali va disk oʻlchamini rejalashtiring.
TTL/length-limit, priority navbat siyosati faqat real ehtiyojda (qimmat).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
Kafka
SSD/NVMe, tezkor tarmoqlar; OS-tyuning (past swappiness, fayl limitlari).
`acks=all`, `linger. ms’(batching),’compression. type = zstd ’/lz4 uchun.
Isteʼmolchi parametrlari:’max. poll. interval. ms`, `max. poll. records`, `fetch. min. bytes`.
Retention va compaction - saqlash/replay balansi.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) Integratsiya va ekotizim
Kafka Connect (Sinks/Sources), Schema Registry (Euro/JSON/Protobuf) va muvofiqlik (’BACKWARD/FORWARD/FULL’).
Kafka Streams/ksqlDB: stateful operatsiyalari, oynalar, agregatlar.
RabbitMQ Shovel/Federation: klaster/markazlar orasiga koʻchirish.
K8s operatorlari: Strimzi (Kafka), RabbitMQ Cluster Operator; GitOps manifestlari.
11) Joriy etish chek-varaqasi (0-45 kun)
0-10 kun
Use-case’larni aniqlash: buyruqlar/taskalar (RabbitMQ), voqealar/audit (Kafka).
Kalitlarni tanlash (’routing key ’/’ partition key’), «nashr → qayta ishlash» SLOni oʻrnatish.
Asosiy xavfsizlik siyosati (TLS, ACL), kvotalar, DLQ/TTL.
11-25 kun
outbox/inbox, idempotentlik va dedupni joriy etish.
Backoff (Rabbit: TTL + DLX; Kafka: retry topics).
Dashbordlar: lag, age, DLQ-rate, end-to-end latency; alertlar.
26-45 kun
Tyuning: prefetch/acks (Rabbit); partitions/acks/batch (Kafka).
DR-protseduralar (ko’zgu/replikatsiya), uzellarni ishdan chiqarish testlari.
Voqealar kontraktlarini (sxemalarini) va muvofiqlik siyosatini hujjatlashtirish.
12) Anti-patternlar
Barcha vazifalar uchun bitta «universal» vosita.
DLQ/TTL yo’qligi: abadiy zaharlovchilar (poison messages).
Cheksiz’prefetch’→ iste’molchilarning ochligi, o’sish p99.
Kafka kalitsiz → tartibini yoʻqotish/andoza issiq partiyalar.
«Exactly-once» haqiqiy ehtiyojsiz/intizomsiz - soxta xavfsizlik hissi.
Koddagi sirlar/loginlar, TLS/ACLsiz.
Registry va migratsiyasiz xardkod sxemalari/xabarlarning versiyalari.
13) Etuklik metrikasi
Lag/age SLO 99% ≥ bajariladi; DLQ-rate nazorat ostida.
Idempotentlik kritik yo’llarning 100 foizini qoplaydi; outbox/inbox joriy etildi.
Retention/compaction hujjatlashtirilgan.
ISR/URP (Kafka) va Raft/disk limitlari (Rabbit) uchun alertlar sozlangan.
Voqealar kontraktlari versionatsiya qilinadi (Schema Registry), muvofiqlik CI da sinovdan o’tkaziladi.
Muntazam game-days: uzel/broker/AZ nosozligi, tiklanishni tekshirish.
14) Konfiguratsiya namunalari (ma’lumot)
RabbitMQ: prefetch va tasdiqlash (pseudocode):python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
Kafka Consumer (g’oyalar):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) Xulosa
RabbitMQ va Kafka turli xil vazifalarni hal qiladi: buyruqlar/taskalar va uzoq muddatli voqealar jurnali va ko’paytiriladigan strimingga qarshi boy marshrut. Muvaffaqiyat - to’g’ri yetkazib berish semantikalari, idempotentlik intizomi, puxta o’ylangan kalitlash, retrajlar/DLQ, kuzatuv va qat’iy xavfsizlikda. Navbatlar atrofida muhandislik amaliyotini - outbox/inbox, sxemalar va GitOps siyosatini yarating - va sizning integratsiyangiz oldindan aytib bo’ladigan, ko’paytiriladigan va barqaror bo’ladi.