Brokerii de mesaje
1) De ce brokerii de mesaje
Brokerul dezleagă producătorii și consumatorii de timp/viteză/fiabilitate:- Vârf tamponare și netezire, backprescher.
- Citiți/scrieți scalarea în mod independent.
- Observabilitatea și reluarea evenimentelor.
- Modele arhitecturale: event-driven, CQRS, event sourcing, outbox/inbox.
2) Modele și termeni de bază
2. 1 Kafka (model jurnal)
Subiect → părți (busteni comandate) → compensează de la consumatori.
Consumer Group: Citiți paralelismul, echilibrarea partidului.
Reținerea în funcție de timp/volum; compactare cheie.
Semantică: minim - cel puțin o dată, cu setări - efectiv exact o dată (producători idempotenți + tranzacții).
Ordin: Garantat în cadrul partidului.
2. 2 NATS (subiecți, latență scăzută)
Subiect (temă) cu ierarhie și wildcards ('foo. ',' foo. >`).
Moduri: pub/sub, grupuri de coadă (fan-out cu distribuție de lucru), cerere-răspuns (RPC rapid).
Nucleul NATS - latență efemeră, ultra-scăzută; JetStream - persistenta/retentie/repetitii.
Ordine: cel mai bun efort, nici o garanție globală puternică; cu JetStream - comanda pe flux, dar reordonarea rară în caz de eșecuri este posibilă.
3) Semantica de livrare și consistență
Idempotența și dedupul sunt responsabilitatea aplicării/vânătăii, chiar și atunci când „exact o dată” în Kafka.
4) Ordine, partiționare și chei
Kafka
Alegerea cheii mesajului determină partidul → o ordine locală puternică.
Ключи: 'agregate _ id',' tenant _ id', 'order _ id'. Evitați cheile fierbinți.
Balanță: N partide ≈ citirea nivelului paralelismului.
NATS
La Core, grupul de coadă face echilibrul.
JetStream Stream este amestecat de subiecți; accent pe ventilator larg/ventilator în cu latență scăzută.
5) retenție, reluare și compactare
Kafka
Retentie: "retentie. ms/bytes ".
Compactare: stochează „ultima valoare după cheie” (potrivit pentru instantanee/cache/sagas).
Replay: Orice consumator poate „derula înapoi” compensează.
JetStream
Fluxuri: fișier/memo backends, politica de stocare de timp/octeți/numărul de mesaje.
Consumatori: pull/push, durabil/efemer, filtru după prefixele subiectului.
Replay: redelivery sau lectură de la început/offset-like (secvență).
6) Tranzacții, outbox și consecvență
Kafka
Producător Idempotent ("activează. idempotence = true '): protecție împotriva duplicatelor.
Tranzacții: înregistrarea atomică a mai multor loturi + angajarea consumatorilor-compensează → model de citire-proces-scriere fără „găuri”.
Outbox tranzacțional: o înregistrare a unui eveniment de afaceri și o linie outbox într-o singură tranzacție de baze de date, lucrătorul publică în Kafka.
NATS
Nu există tranzacții „cross-stream” ca în Kafka; utilizați outbox/inbox și consumatori idempotenți (chei, deadstore).
7) RPC și cerere-răspuns
Kafka este incomod pentru RPC (deasupra capului, ordinea/răspunsurile sunt mai dificile). Utilizați comenzi/evenimente asincrone.
NATS: ideal pentru cerere-răspuns (milisecunde, corelație, timeout).
go resp, err:= nc. Request("profile. get", []byte(`{"id":42}`), 200time. Millisecond)
8) Funcționare și topologii
8. 1 Kafka
Cluster: brokeri + ZooKeeper (înainte de versiunile vechi) sau KRaft (metadate noi).
Replicare - Zona RF≥3, ISR/Controlere
Multi-regiune: MirrorMaker 2/Cluster Linking; active-pasiv/activ-activ cu politici de conflict.
Capacitate disc/rețea: citiți din 'throughput × retenție × replici'.
8. 2 NATS
Cluster: multe noduri, super-cluster (geo-distribuție), leafnodes pentru periferice/margine.
JetStream: plasarea fluxurilor de seturi de noduri (plasare), replicarea (R = 1.. 5).
Previzibil latenţă scăzută, federaţie uşoară.
9) Siguranță
Kafka
TLS (mTLS), SASL: SCRAM, OAuthBearer.
ACL pe subiecte/grupuri/tranzacții.
Criptare „în repaus” (OS/discuri) + politici de rețea.
NATS
identități nkey/JWT, conturi de operator, pe subiect ACL.
mTLS între noduri și clienți.
Izolarea chiriașilor (conturi) + limite.
10) Măsurători de observabilitate și performanță
Kafka
Брокер: 'BytesIn/Out', 'RequestQueue', 'UnderReplicatedPartitions', statistici GC/FS.
Subiect/parte: 'logEndOffset', lag de consum (critic).
Producător/consumator: retrai, "lot. size ',' linger. ms', „adu”. min. bytes, erori.
Instrumente: JMX, Cruise Control (re-echilibru), Schema Registry.
NATS/JetStream
Server: conn/msgs/sec, RTT, CPU/mem, detectarea lentă a consumatorilor.
JetStream: pe flux/consumator - lag, redeliveries, acks, bytes de stocare.
Monitorizare: punct final încorporat, nsc/adm-CLI, tablouri de bord.
11) Performanță și tuning
Kafka
Butches mari și "linger. dna "improve debit și comprima p99.
Compresia (lz4/zstd) salvează rețeaua/discul.
num. partiții după numărul de consumatori/nuclee, dar nu deasupra capului.
Unități: NVMe preferat, XFS/EXT4 cu „noatime”.
NATS
Mesajele mici, multe conexiuni sunt norma; păstrați grupuri de coadă „wide”.
JetStream: tune 'max _ ack _ pending', pull vs push, dimensiunea loturilor.
Backpressure: 'FlowControl', 'IdleHeartbeat', limitele serverului.
12) Modele de integrare
Outbox/Inbox (în ambele Kafka și NATS).
SAGA: orchestrarea evenimentelor; bunicul prin 'saga _ id + step'.
Modificarea capturii de date (CDC): Debezium → Kafka; în NATS - modelul „publisher from database triggers/busteni”.
Procesarea fluxurilor: Kafka Streams/Flink/Spark; în NATS - procesoare/caracteristici terțe, consumatori JetStream.
Dead Letter Queue (DLQ) și încercați din nou politici (backoff exponențial + jitter).
13) Exemple de configurare
13. 1 Kafka: a face un subiect și producător
bash kafka-topics. sh --create --topic orders \
--partitions 12 --replication-factor 3 \
--config cleanup. policy=delete \
--config retention. ms=604800000 # 7d
properties producer. properties bootstrap. servers=broker:9092 acks=all enable. idempotence=true batch. size=65536 linger. ms=10 compression. type=zstd
13. 2 Fluxuri Kafka: prelucrare idempotentă (schiță)
java builder. <String, Order>stream("orders")
.groupByKey()
.aggregate(/... /)
.toStream()
.to("orders-agg");
13. 3 NATS JetStream: stream + consumator (nats CLI)
bash nats stream add ORDERS --subjects "orders. " --retention limits \
--storage file --max-bytes 100GB --replicas 3 --discard old
nats consumer add ORDERS ORDERS-WORKERS --filter "orders. created" \
--deliver pull --ack explicit --max-deliver 6 --backoff "1s,5s,30s,2m"
13. 4 NATS Cerere-răspuns (Du-te)
go nc, _:= nats. Connect("tls://nats:4222", nats. Secure(tlsConf))
sub, _:= nc. QueueSubscribe("calc. sum", "workers", func(m nats. Msg) {
//... process...
m. Respond([]byte("42"))
})
14) Kafka vs NATS alege: Un ghid rapid
Avem nevoie de reluare, retenție pe termen lung, compresie, procese de flux greu → Kafka.
Aveți nevoie de RPC rapid, ventilator/ventilator cu microlatență, operare simplă, edge/IoT → NATS (Core).
Avem nevoie de persistență + fan-out, dar fără platforma grea „log” → NATS JetStream.
Ordin strict de cheie și tranzacție → Kafka.
15) Planificarea capacității (simplificată)
Kafka
1. Throughput: 'inbound _ MBps RF 86400' discuri.
2. Loturi: 'target _ concurrency' × stocul 1. 5-2 ×.
3. Rețea: p99 + replicare + comprimare producător.
NATS/JetStream
1. Mesaje/sec și debit mediu de →.
2. Retenţie × replici → depozitare.
3. Limitele consumatorilor (ack-pending, redeliveries), CPU pentru serializare.
16) Funcționare sigură: listă de verificare
- TLS/mTLS activat, secretele rotite.
- ACL/conturi/cote (per chiriaș).
- Idempotența asupra consumatorilor, DLQ și retragerile jitter.
- Lag/throughput/error monitoring; alerte pe URP (Kafka), redelivery storm (NATS).
- Tablouri de bord de capacitate: partiții, stocare, p99.
- Node/zone failure tests, game-days, reluare/rambursare.
- Schema Registry/JSON Chei Schema sunt documentate.
- Politicile de retenție/comprimare/TTL sunt aliniate la conformitate.
- Versiunile broker/client sunt actualizate în mod regulat; compatibilitatea protocolului de sârmă verificată.
17) Anti-modele
Cheie fierbinte (toate evenimentele de același ID) → un flux „fierbere”. Shardy/tampon.
Se retrage fără idempotenţă → efecte duble.
Mesaje uriașe (MB-zeci) → fragmentare/pauze GC. Stocați sarcina utilă în obiect, trimiteți link-uri.
Amestecarea RPC și streaming în Kafka → un ciclu de viață complex/ordine.
JetStream ca „DWH pe termen lung” → off-label; magazin pentru o lungă perioadă de timp în paturi obiect/coloană.
Niciun DLQ nu → mesaje „otrăvitoare” care se învârt la nesfârşit.
Reținerea uitată → discurilor sunt pline, oprirea clusterului.
18) ÎNTREBĂRI FRECVENTE
Î: Pot face „exact-o dată” la sfârșitul conductei?
R: În practică - efectiv da: Kafka (producător idempotent + tranzacții) și chiuvete idempotente (cheie, upsert). În NATS - prin idempotență/dedup în aplicație.
Î: Ce să alegeți pentru un milion de RPC-uri mici/sec?
R: NATS Core: Microlatență, cerere-răspuns, conexiuni ușoare și grupuri de coadă.
Î: Aveți nevoie de compactare și instantanee de avere?
R: Kafka с "curățare. policy = compact ', key = agregate/resource.
Î: Cum să se ocupe de lag?
R: Creșterea numărului de loturi/lucrători, reducerea timpului de procesare, lot și prefetch, optimizarea deserializării, consolidarea verticală a brokerilor/unităților.
Î: Multi-regiune și DR?
R: Kafka - MirrorMaker 2/Cluster Legarea, răspunderea activelor cu RPO≈sekundy. NATS - supercluster/leafnodes; JetStream oglindire/replici pe zone.
19) Totaluri
Kafka și NATS închid diferite moduri: Kafka - jurnale de evenimente durabile, debit mare, tranzacționalitate și reluare; NATS este un autobuz ultralight pentru latență scăzută, RPC și fan-out simplu, cu JetStream pentru persistență. Alegeți din semantica de livrare, comandă și retenție, latență și costuri de operare. Cheile/petrecerile de design, retenția, DLQ și observabilitatea - iar arhitectura evenimentului va fi previzibilă, scalabilă și fiabilă.