Հաղորդագրությունների գծերը ՝ RabbitMQ, Kafka
Հաղորդագրությունների գծերը ՝ RabbitMQ, Kafka
1) Ե՞ րբ ընտրել
RabbitMQ (AMQP 0-9-1 / 1. 0, դասական գծեր, Disrum Queues, Streams)
Հարմար է 'RPC/թիմեր, workflow, կարճ խնդիրներ, fanout/topic, ճկուն ապացույցներ, առաջնահերթություններ։
Պլյուսներ 'հարուստ ուղղորդման սեմանտիկան (exchanges), «basic»։ qos '(wwww.fetch), per-www.TTL/www.ay, հարմար RPC (reply-to), թեթև մեկնարկը։
Մինուսներ 'պատմությունը պահպանվում է հերթում, հորիզոնական մեծացումը հերթերով/շարդամներով։ Բարձր throughput արժեքը շատ մեծ հոսքերով։
Apache Kafka (իրադարձությունների լոգ, կուսակցություն, consumer nowups)
Հարմար է իրադարձությունների հոսքերի, պարամետրերի, event sourcing, ETL/ինտեգրման (Connect), բարձր RPS/MBps, replay/re պրոցեսինգի, streams/ksqlDB) համար։
Պլյուսներ ՝ երկարաժամկետ ամսագիր, կուսակցության մասշտաբներ, կայուն ճեղքվածքներ, բաղադրատոմսեր։
Minus: «pox + կուսակցության» մոդելը փոքր RPC-ի համար չէ։ կարգուկանոնը միայն կուսակցության սահմաններում է։ սխեմաների և համատեղելիության կառավարումը թիմի պաշտպանությունն է։
2) Առաքման և ինվարանտների սեմանտները
At-most-once: առանց retrav; արագ, կորստի վտանգը։
At-least-once: գետերի հետ; պահանջում է սպառողի կողմնակալություն։
Exactly-once: հասանելիորեն սահմանափակ պայմաններում (Kafka TX + idempotent dowser + համաձայնեցված sink; RabbitMQ-ը dedupa/idempotent բանալիների աղյուսակի միջոցով է)։
Կարգը ՝ RabbitMQ-ը հերթում կարգուկանոն է (կարող է խախտվել ռելեների/մուլտֆիլմերի); Kafka-ը կուսակցությունում կարգուկանոն է, բանալին տալիս է կուսակցությունը։
Տիրույթի ինվարանտները 'փողը/հավասարակշռությունները' ամսագրերի/սագայի և գաղափարական թիմերի միջոցով։ մի ապավինեք LWW-ին։
3) Patterns
Medibox/InBox: BD-ում իրադարձության ատոմային ձայնագրությունը բացատրում է հրապարակումը (wwww.box) և գաղափարական սպառումը վերամշակման հատակով (inbox)։
DLQ (մահացած նամակներ) 'N փորձերից/սխալներից հետո, DLQ + alert-ում։
Retry/Delay: RabbitMQ — TTL + dead-letter exchange; Kafka-ը retry-topics է backoff-ից։
Request/Reply: RabbitMQ — `reply_to` + `correlation_id`; Kafka-ը հազվադեպ է, միայն patterns-ը։
Փոխհատուցում 'սագներ իրադարձությունների վրա։ յուրաքանչյուր վիրահատություն հակառակն է։
4) Ուղղափառության և տեղաբանության նախագծումը
RabbitMQ
Exchanges: `direct`, `topic`, `fanout`, `headers`.
Routing key: որոշում է հերթը (և)։ Առաջնահերթության համար անհատական գծեր են։
QoS: «www.fetch» (օրինակ, 50-300) հավասարակշռում է արագությունը/լատենտությունը։
Delrum Queues: Raft-ի կրկնօրինակված տողերը; փոխարինող mirrored classic.
Streams: հոսքը օֆսեթներով (Kafka-նման) high-throughput/repley-ի համար։
Kafka
Topic partitions: Պլանավորեք «# partitions» նպատակային throughput և զուգահեռ (հետ միասին ավելացրեք ավելի հեշտ, քան նվազեցնել)։
Քեյ 'մեկ ստեղնաշարի բոլոր գրառումները մեկ կուսակցության մեջ են (կարգուկանոնի երաշխիք բանալին)։
Replant factor: 3 արդյունավետ թեմաների համար, "min. insync. replicas = 2 '+' acks = all 'հուսալիության համար։
Retention: Ժամանակի/չափի; compaction - պահպանում է վերջին արժեքները + tombstones-ի համար։
5) Retrai, DLQ, impotenty
RabbitMQ
Կրկնությունները ՝ per-35TTL + DLX (dead-letter) backoff-ից (օրինակ ՝ 1m 355m)։
Idempotention: «wwww.relation _ id »/« www.ru-id» + -ը վերամշակված հաղորդագրությունների (TTL) կամ դետերմինացված թիմեր։
Ապացույցները ՝ manium 'basic։ ack 'հաջող գործարքից հետո, "basic. nack(requeue=false)` в DLQ.
Kafka
Կրկնություններ ՝ առանձին retry-topics; consumer-ը հաշվում է օֆսեթը հաջողակ side-effect-ից հետո։
Exactly-once processing (EOS): Producer `enable. idempotence = dive ', գործարքային directer/consumer, «read _ comitted» սպառողի վրա։ sink (օրինակ, Kafka no Kafka կամ Kafka no DB գործարքի միջոցով) - ուշադիր համաժամեցնել։
Dedup 'բանալին/idempotent բանալին բազայի կողմում, կամ compacted topic-ի միջոցով։
6) Արտադրողականություն և չափում
Լիթլի օրենքը '«L = now.W»
Վորկերների համար 'պահանջվող զուգահեռ "N + arrival _ rate divg _ processing _ time processing _ Time-ը (1։ 2–1. 5)`.
RabbitMQ 24fetch: Սկսեք «www.fetch = 100» և չափեք r99/ժամանակը «in-flit»։
Kafka partitions: Հաշվարկը ցանկալի consumer-զուգահեռ և նպատակներից throughput (օրինակ, 1 կուսակցությունը կայուն 5-20 MB/s SSD/10GbE)։
7) Դիտողությունն ու ալերտները
Ընդհանուր
Lag/Backlog (հաղորդագրություններ/բայթ), հաղորդագրությունների age (p95/p99), error-rate, DLQ-rate։
«Հրատարակման արտադրման» ժամանակը (end-to-end)։
Կախվածության քարտեզը 'վաճառող www.brocer wwww.condumer։
RabbitMQ:- Կապերը, ջրանցքները, ոչ-acked հաղորդագրությունները, «memory _ alarm», «entk _ free _ limit», «queue length» p95։
- Corrum-ի զեկույցները (leader, Raft log, propachi 'www.rum www.t 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) Անվտանգություն և մուլտֆիլմ-տենանտիզմ
TMS-transit-ի կոդավորումը, վավերացումը (SASL/PLAIN/SCPS/OAuth, mTSA)։
Հեղինակային իրավունքը 'vhost/permissions (RabbitMQ), ACL-ը տոպիկի/խմբի վրա (Kafka)։
Քվոտաներ ՝ կապի, ալիքների, հերթի չափի/տոպիկի, հրապարակման/կարդալու արագության վրա։
Մեկուսացումը միջին (dev/stage/2019) և namespace/vhost-ով։
9) Շահագործումը և թյունինգը
RabbitMQ
Բացեք exchanges/queues հանգույցներով (CPU/IO)։
Lazy queues (հաղորդագրություններ սկավառակի վրա) մեծ ֆորումների համար։ խուսափեք «տաք» հերթերից առանց շարդինգի։
Corrum Queues-ը HA-ի համար։ պլանավորեք Raft ամսագրի և սկավառակի չափը։
TTL/length-limit, priority հերթը միայն իրական կարիքի դեպքում (թանկ)։
DLQ/TTL քաղաքականության օրինակ (գաղափարը)
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
Kafka
SSD/NVMe, արագ ցանցեր; OS-tuning (swappiness ցածր, ալյումինե լիմիտներ)։
`acks=all`, `linger. 07 '(մարտկոցը), "compression. = zstd '/lz4 համար։
Սպառողի պարամետրերը '' max։ poll. interval. ms`, `max. poll. records`, `fetch. min. bytes`.
Retention-ը և compaction-ը repley-ի հավասարակշռությունն է։
Վստահելի հրատարակման օրինակ (Java, գաղափարներ)
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) Մոսկվան և էկոհամակարգը
Kafka Connect (Sinks/Sources), Schema Registry (Avro/JSON/Delobuf) և համատեղելիությունը («BACKWARD/FORWARD/FASE»)։
Kafka Streams/ksqlDB: stateful վիրահատություն, պատուհաններ, ագրեգատներ։
RabbitMQ Shovel/Federation-ը կլաստերների/կենտրոնների միջև փոխանցումն է։
Օպերատորներ K8s: Strimzi (Kafka), RabbitMQ Cluster Operics; GitOps-մանիֆեստներ։
11) Ներդրման թուղթ (0-45 օր)
0-10 օր
Որոշեք use-cult 'a: Թիմեր/tasks (RabbitMQ), իրադարձություններ/աուդիտ (Kafka)։
Ընտրել բանալիներ («routing key »/« partenskey»), SLO-ին տալ «վերամշակման հրատարակություն»։
Հիմնական անվտանգության քաղաքականությունները (TFC, ACL), քվոտաները, DLQ/TTL։
11-25 օր
Ներդրել box/inbox, idempotention և dedup։
Տեղադրեք ռետրերը backoff (Rabbit: TTL + DLX; Kafka: retry topics).
Dashbords: lag, age, DLQ-rate, end-to-end latency; ալերտներ։
26-45 օր
Թյունինգը 2019: www.fetch/acks (Rabbit); partitions/acks/batch (Kafka).
DR ընթացակարգերը (հացահատիկի/կրկնօրինակումը), հանգույցների ձախողման թեստերը։
Փաստաթղթավորել իրադարձությունների պայմանագրերը (սխեմաները) և ինտեգրման քաղաքականությունը։
12) Anti-patterna
Մեկ «համընդհանուր» գործիք բոլոր խնդիրների համար։
DLQ/TTL-ի բացակայությունը 'հավերժական թունավորիչներ (poison drages)։
Անսահմանափակ 'www.fetch' - սպառողների սովը, p99 աճը։
Kafka-ն առանց արգելքի հաստատեց կարգի/տաք կուսակցության կորցումը լռելյայն։
«Exactly-once» -ը առանց իրական կարիքների/կարգապահության անվտանգության կեղծ զգացողություն է։
Գաղտնիքները/տրամաբանությունները կոդում, առանց TMS/ACL-ի։
Hardcod սխեմաներ/հաղորդագրությունների տարբերակներ առանց Registry և խմբակցությունների։
13) Հասունության մետրերը
Lag/age SLO-ն կատարվում է ժամանակի 3699 տոկոսը։ DLQ-rate-ը վերահսկողության տակ է։
Idempotenty-ը ծածկում է քննադատական ճանապարհների 100 տոկոսը։ Box/inbox-ը ներդրված է։
Retention/compaction-ը տեղադրված է, չի կոտրում սպառողներին։
Alerts ISR/URP (Kafka) և Raft/սկավառակի լիմիտներ (Rabbit)։
Իրադարձությունների պայմանագրերը տարբերակվում են (Schema Registry), համատեղելիությունը փորձարկվում է CI-ում։
Dragame-days 'հանգույցի/brocer/AZ-ի հրաժարվելը, վերականգնման ստուգումը։
14) Գենդերային օրինակներ (կամար)
RabbitMQ: prefetch և հաստատումը (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 (գաղափարներ)
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) Եզրակացություն
RabbitMQ-ը և Kafka-ը լուծում են առաջադրանքների տարբեր դասարաններ ՝ թիմեր/տաշկի և հարուստ միկրոօրգանիզմներ իրադարձությունների երկարաժամկետ ամսագրի և մեծացված սթրիմինգի դեմ։ Հաջողությունը ճիշտ առաքման սեմանտիկներում է, գաղափարախոսության կարգապահությունը, մտածված հիմնականը, գետերը/DLQ, դիտարկումը և խիստ անվտանգությունը։ Կառուցեք կառուցվածքի շուրջ ինժեներական պրակտիկան 'www.box/inbox, սխեմաներ և GitOps քաղաքականություն, և ձեր ինտեգրումը կդառնա կանխատեսելի, մեծացված և կայուն։