Mesaj növbələri: RabbitMQ, Kafka
Mesaj növbələri: RabbitMQ, Kafka
1) Nə zaman seçmək lazımdır
RabbitMQ (AMQP 0-9-1 / 1. 0, klassik növbələr, Quorum Queues, Streams)
Uyğun: RPC/komandalar, workflow, qısa tapşırıqlar, fanout/topic marşrutlaşdırma, çevik təsdiqlər, prioritet idarəetmə.
Üstünlüklər: zəngin marşrutlaşdırma semantikası (exchanges), 'basic. qos '(prefetch), per-message TTL/delay, rahat RPC (reply-to) nümunələri, asan başlanğıc.
Dezavantajları: hekayə növbədə saxlanılır, növbələr/çardaqlar üzrə üfüqi miqyaslandırma; çox böyük axınlar ilə yüksək Throughput dəyəri.
Apache Kafka (hadisələr log, partiyalar, consumer groups)
Üçün uygundur: hadisə axını, audit, hadisə qaynağı, ETL/inteqrasiya (Connect), yüksək RPS/MBps, replay/re-prosessing, axın prosessing (Streams/ksqlDB).
Üstünlüklər: uzunmüddətli jurnal, partizan miqyası, davamlı replay, açarların kompakt edilməsi.
Mənfi cəhətləri: «pull + partiya» modeli - kiçik RPC üçün deyil; yalnız partiya daxilində nizam; sxemlərin/uyğunluğun idarə edilməsi komandanın vəzifəsidir.
2) Çatdırılma semantikası və invariantları
At-most-once: retrajsız; tez, itki riski.
At-least-once: retras ilə; istehlakçının idempotentliyini tələb edir.
Exactly-once: məhdud şəraitdə əldə edilə bilər (Kafka TX + idempotent prodüser + razılaşdırılmış sink; RabbitMQ - baba cədvəli/idempotent açarları vasitəsilə).
Sifariş: RabbitMQ - növbə qaydası (retralar/multi-konsumerlər zamanı pozula bilər); Kafka - partiyada nizam, açar partiyalaşdırmanı təyin edir.
Domen invariantları: pul/balans - jurnallar/dastanlar və idempotent komandalar vasitəsilə; LWW-yə güvənməyin.
3) İnteqrasiya nümunələri
Outbox/InBox: DB atomik hadisə qeyd → Post növbə (outbox) və embleming log ilə idempotent istehlak (inbox).
DLQ (ölü məktublar): N cəhd/səhv sonra - DLQ + alert.
Retry/Delay: RabbitMQ — TTL + dead-letter exchange; Kafka - backoff ilə retry-topik.
Request/Reply: RabbitMQ — `reply_to` + `correlation_id`; Kafka - nadir hallarda, yalnız xüsusi nümunələrlə.
Kompensasiya: hadisələr üzərində dastanlar; hər əməliyyat əks var.
4) Açarların və topologiyaların layihələndirilməsi
RabbitMQ
Exchanges: `direct`, `topic`, `fanout`, `headers`.
Routing key: növbəyə (və) daxil olmağı təyin edir. Prioritetləşdirmə üçün - ayrı-ayrı növbələr.
QoS: 'prefetch' (məsələn, 50-300) sürəti/gecikməni balanslaşdırır.
Quorum Queues: Raft-da təkrarlanan növbələr; mirrored classic əvəz.
Streams: high-throughput/replay üçün offset axını (Kafka kimi).
Kafka
Topic → partitions: Hədəf throughput və paralellik üçün '#partitions' planlayın (geri uyğun artırmaq azaltmaqdan daha asandır).
Key: Bir açarın bütün qeydləri - bir partiyada (açar qaydasına zəmanət).
Replication factor: 3 məhsuldar mövzular üçün, 'min. insync. replicas = 2 '+' acks = all 'etibarlılığı üçün.
Retention: vaxt/ölçüsü; compaction - silinməsi üçün açar + tombstones son qiymətləri saxlayır.
5) Retray, DLQ, idempotent
RabbitMQ
Təkrar: per-message TTL + DLX (dead-letter exchange) ilə backoff (məsələn, 1m → 5m → 15m).
İdempotentlik: 'correlation _ id '/' message-id' + emal edilmiş mesajlar cədvəli (TTL) və ya müəyyən edilmiş komandalar.
Təsdiq: manual 'basic. ack 'uğurlu əməliyyatdan sonra;' basic. nack(requeue=false)` в DLQ.
Kafka
Təkrar: ayrı-ayrı retry-topiklər; uğurlu side-effect sonra consumer kommitit ofset.
Exactly-once processing (EOS): Producer `enable. idempotence = true ', əməliyyat producer/consumer,' read _ committed 'istehlakçı; sink (məsələn, Kafka → Kafka və ya Kafka → DB əməliyyat vasitəsilə) - diqqətlə sinxronizasiya.
Dedup: baza tərəfində açar/idempotent açar ilə və ya compacted topic vasitəsilə.
6) Performans və ölçü
Little Law: 'L = λ × W'
Workers üçün: tələb olunan paralellik 'N ehtiyat (1. 2–1. 5)`.
RabbitMQ prefetch: 'prefetch = 100' ilə başlayın və p99/in-flight vaxtını ölçün.
Kafka partitions: istədiyiniz consumer-paralellik və throughput hədəfləri hesablanması (məsələn, SSD/10GbE-də 1 partiya sabit 5-20 MB/s).
7) Müşahidə və alertlər
Ümumi:- Lag/Backlog (mesajlar/bayt), age mesajları (p95/p99), error-rate emal, DLQ-rate.
- Vaxt «nəşr → emal» (end-to-end).
- Asılılıq kartı: prodüser → broker → konsumer.
- Bağlantılar, kanallar, acked olmayan mesajlar, 'memory _ alarm', 'disk _ free _ limit', 'queue length' p95.
- Quorum hesabatları (leader, Raft log, səhvlər '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) Təhlükəsizlik və çox tenant
TLS in-tranzit şifrələmə, autentifikasiya (SASL/PLAIN/SCRAM/OAuth, mTLS).
Avtorizasiya: vhost/permissions (RabbitMQ), ACL üçün topiklər/qruplar (Kafka).
Kvotalar: bağlantılar, kanallar, növbə ölçüsü/topika, nəşr/oxu sürəti.
Çərşənbə (dev/stage/prod) və namespace/vhost.
9) Əməliyyat və sazlama
RabbitMQ
Exchanges/queues-i qovşaqlara (CPU/IO kapasite) çatdırın.
Lazy queues (disk mesajları) böyük buferlər üçün; şərdinq olmadan «isti» növbələrdən çəkinin.
HA üçün Quorum Queues; Raft jurnalı və disk ölçüsünü planlaşdırın.
TTL/length-limit siyasəti, prioritet yalnız real ehtiyac (bahalı).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
Kafka
SSD/NVMe, sürətli şəbəkələr; OS-tuning (aşağı swappiness, fayl limitləri).
`acks=all`, `linger. ms '(batching),' compression. type = zstd '/lz4 keçid üçün.
İstehlakçı parametrləri: 'max. poll. interval. ms`, `max. poll. records`, `fetch. min. bytes`.
Retention və compaction - saxlama/replay balansı.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) İnteqrasiya və ekosistem
Kafka Connect (Sinks/Sources), Schema Registry (Avro/JSON/Protobuf) və uyğunluq ('BACKWARD/FORWARD/FULL').
Kafka Streams/ksqlDB: stateful əməliyyatları, pəncərələr, aqreqatlar.
RabbitMQ Shovel/Federation: klasterlər/mərkəzlər arasında transfer.
K8s operatorları: Strimzi (Kafka), RabbitMQ Cluster Operator; GitOps-manifestlər.
11) Giriş çek siyahısı (0-45 gün)
0-10 gün
use-case-ləri müəyyənləşdirin: komandalar/çəkilişlər (RabbitMQ), hadisələr/audit (Kafka).
Açarları seçin ('routing key '/' partition key'), SLO «nəşr → emal» təyin edin.
Əsas təhlükəsizlik siyasətləri (TLS, ACL), kvotalar, DLQ/TTL.
11-25 gün
outbox/inbox, idempotent və deadup tətbiq edin.
Backoff (Rabbit: TTL + DLX; Kafka: retry topics).
Daşbordlar: lag, age, DLQ-rate, end-to-end latency; alertlər.
26-45 gün
Keçid sazlama: prefetch/acks (Rabbit); partitions/acks/batch (Kafka).
DR prosedurları (güzgü/replikasiya), düyün nasazlığı testləri.
Hadisə müqavilələri (sxemlər) və uyğunluq siyasətini sənədləşdirin.
12) Anti-nümunələr
Bütün vəzifələr üçün bir «universal» alət.
DLQ/TTL olmaması: əbədi zəhərləyicilər (poison messages).
Limitsiz 'prefetch' → istehlakçıların aclığı, p99 artımı.
Kafka açarları olmadan → nizam itkisi/default isti partiyalar.
Real ehtiyac/nizam-intizam olmadan «Exactly-once» - yanlış təhlükəsizlik hissi.
TLS/ACL olmadan kodda sirləri/girişləri.
Hardcode sxemləri/Qeydiyyat və miqrasiya olmadan mesajlar versiyası.
13) Yetkinlik metrikası
SLO Lag/age 99% ≥ yerinə yetirilir; DLQ-rate nəzarət altındadır.
İdempotentlik kritik yolların 100% -ni əhatə edir; outbox/inbox tətbiq olunur.
Retention/compaction sənədləşdirilmiş, replik istehlakçıları pozmur.
ISR/URP (Kafka) və Raft/disk limitləri (Rabbit) üçün alertlər konfiqurasiya edilmişdir.
Hadisə müqavilələri versiyalaşdırılır (Schema Registry), uyğunluq CI-də sınaqdan keçirilir.
Müntəzəm oyun günləri: qovşaq/broker/AZ uğursuzluğu, bərpa yoxlama.
14) Konfiqurasiya nümunələri (xülasə)
RabbitMQ: prefetch və təsdiq (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 (fikirlər):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) Nəticə
RabbitMQ və Kafka müxtəlif sinifləri həll edir: uzun müddətli hadisə jurnalı və miqyaslı axına qarşı komandalar/çəkilişlər və zəngin marşrut. Müvəffəqiyyət - düzgün çatdırılma semantikaları, idempotentlik intizamı, düşünülmüş açar, retralar/DLQ, müşahidə və ciddi təhlükəsizlik. Növbələr ətrafında mühəndislik təcrübəsi qurun - outbox/inbox, sxemlər və GitOps siyasəti - və inteqrasiyanız proqnozlaşdırıla bilən, ölçülə bilən və sabit olacaq.