Broker di messaggi
1) Perché i broker di messaggi
Il broker esegue i produttori e i consumatori in termini di tempo/velocità/affidabilità:- Buffer e antialiasing dei picchi, backprescher.
- Scalare la lettura/scrittura in modo indipendente.
- Osservabilità e riproduzione (replay) degli eventi.
- Pattern architettonici: event-driven, CQRS, event source, outbox/inbox.
2) Modelli e termini di base
2. 1 Kafka (modello di tubo)
Il topic della partitella (loghi ordinati) è stato usato dai consumatori.
Consumer Group - parallelismo di lettura, bilanciamento delle partiture.
Ritensh in termini di tempo/volume; Compattazione a chiave.
Semantica: minimo: at-least-once, mentre le impostazioni sono effectively exactly-once (produttore Idempotent + Transazione).
L'ordine è garantito all'interno della partitura.
2. 2 NATS (temi/subjetts, ritardo basso)
Subject con gerarchia e cartelle ('foo', 'foo'. >`).
Modalità: pub/sub, queue-groups (fan-out con distribuzione del lavoro), richiest-reply (RPC veloce).
Core NATS è una latitanza effimera e ultra bassa; JetStream - persistenza/ritensh/ripetizioni.
Ordine: migliore-sforzo, senza una forte garanzia globale; Con il JetStream, l'ordinamento sullo strike, ma è possibile riordinare raramente i guasti.
3) Semantici di consegna e coerenza
Idampotenza e deadup sono responsabilità dell'applicazione/sink, anche con «exactly-once» in Kafka.
4) Ordine, partizionamento e chiavi
Kafka
La selezione della chiave del messaggio determina l'ordine locale forte della partitura.
Ключи: `aggregate_id`, `tenant_id`, `order_id`. Evitate le chiavi calde.
Il numero N delle partizioni è il livello di parallelismo della lettura.
NATS
In Core, il saldo fa queue-group.
Nel JetStream Stream è un subjetts; Concentrarsi sull'ampio fan-out/fan-in con poco ritardo.
5) Ritocco, repliche e compattazione
Kafka
Retention: `retention. ms/bytes`.
Compattion: memorizza «ultimo valore per chiave» (adatto per snapshot/caschi/saghe).
Replay: qualsiasi consumatore può «cancellare» gli offset.
JetStream
Streams: file/memorie backend, regole di conservazione tempo/byte/messaggi.
Consumers: pull/push, durable/ephemeral, filtro per i prefissi subject.
Replay: redelivery o lettura dall'inizio/offset-like (sequence).
6) Transazioni, outbox e coerenza
Kafka
Idempotent Producer (`enable. idempotence = true ') - Protezione dalle prese.
Trasmissione - Registrazione atomatica di più partizioni + commit consumer-offsets di pattern read-process-write senza «buchi».
Transactional Outbox: registra eventi aziendali e righe outbox in una singola transazione database, il worker pubblica su Kafka.
NATS
Nessuna transazione MJ come Kafka; utilizzare outbox/inbox e le consolle idipotenti (chiavi, dedop store).
7) RPC e richiesta-risposta
Kafka per RPC è scomodo (overhead alto, ordine/risposte più difficile). Usa i comandi asincroni/eventi.
NATS è ideale per richiest-reply (millisecondi, corellazione, timeout).
go resp, err:= nc. Request("profile. get", []byte(`{"id":42}`), 200time. Millisecond)
8) Utilizzo e topologia
8. 1 Kafka
Cluster: broker + ZooKeeper (prima delle versioni precedenti) o KRAFt (nuovo metadato).
Replica: RF≥3 per area, ISR/controller.
Multiregion 2/Cluster Linking; attivo-passivo/attivo-attivo con politiche di conflitto.
Capacità disco/rete - Conteggia da «throughput x retention x replica».
8. 2 NATS
Cluster: molti nodi, super-cluster (georasportazione), leafnodes per periferica/edge.
JetStream - Posizionamento degli strip per set di nodi, replica (R = 1.. 5).
WAN: ritardi prevedibilmente bassi, federazione leggera.
9) Sicurezza
Kafka
TLS (mTLS), SASL: SCRAM, OAuthBearer.
ACL su top/gruppi/transazioni.
Crittografia a riposo (OS/dischi) + criteri di rete.
NATS
nkey/JWT identità, account operatore, per-subject ACL.
mTLS tra i nodi e i clienti.
Isolamento inquilini (accounts) + limiti.
10) Osservabilità e metriche operative
Kafka
Брокер: `BytesIn/Out`, `RequestQueue`, `UnderReplicatedPartitions`, GC/FS stats.
Topic/partition: «logEndOffset», consumer lag (critico).
Produttore/consumatore: retrai, 'batch. size`, `linger. ms`, `fetch. min. bytes', errori.
Strumenti: JMX, Cruise Control (re-bilanciamento), Schema Registry.
NATS/JetStream
Server: conn/msgs/sec, RTT, CPU/mem, rilevazione slow consumer.
JetStream: per stream/consumer — lag, redeliveries, acks, storage bytes.
Monitoraggio: endpoint integrato, nsc/adm-CLI, dashboard.
11) Prestazioni e tuning
Kafka
Grandi battelli e «linger». ms'migliorano throughput e comprimono p99.
La compressione (lz4/zstd) risparmia rete/disco.
num. partition per numero di consumatori/core, ma non sovraccarico (overhead).
Unità NVMe preferite, XFS/EXT4 con'noatime '.
NATS
Messaggi piccoli, molte connessioni - normalità; tenete le queue groups'ampie ".
JetStream: tune `max_ack_pending`, pull vs push, size of batches.
Backpressure: `FlowControl`, `IdleHeartbeat`, server-side limits.
12) Modelli di integrazione
Outbox/Inbox (sia Kafka che NATS).
SAGA - orchestrazione eventi; Dedotto dì saga _ id + step ".
Change Data Capture (CDC): Debezium → Kafka; in NATS è il pattern «publisher da trigger o trigger di database».
Stream processing: Kafka Streams/Flink/Spark; in NATS: processori/funzioni di terze parti, consumers di terze parti.
Dead Letter Queue (DLQ) e retry (backoff esponenziale + jitter).
13) Esempi di configurazione
13. 1 Kafka: creazione di topic e produttore
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 Kafka Streams - Idempotente (sketch)
java builder. <String, Order>stream("orders")
.groupByKey()
.aggregate(/... /)
.toStream()
.to("orders-agg");
13. 3 NATS JetStream: stream + consumer (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 Request-Reply (Go)
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) Selezione di Kafka vs NATS: punto di riferimento rapido
Abbiamo bisogno di repliche, retensioni lunghe, compattazioni, processi strim pesanti di Kafka.
Abbiamo bisogno di RPC rapido, fan-out/fan-in con microlattività, facile da usare, NATS (Core).
C'è bisogno di Persistenza + Fan-Out, ma senza la pesante piattaforma «tana» della NATS.
Ordine rigoroso per la chiave e la transazione di Kafka.
15) Pianificazione della capacità (semplificata)
Kafka
1. Larghezza di banda: 'inbound _ MBps x RF x retention _ days x 86400' unità.
2. Partizioni: «target _ concertency» x riserva 1. 5–2×.
3. Rete: p99 + replica + produttore compressione.
NATS/JetStream
1. Messaggi/secondi e dimensioni medie di throughput.
2. Retention×replicas → storage.
3. Limiti consumers (ack-pending, redeliverie), CPU per la serializzazione.
16) Utilizzo sicuro: foglio di assegno
- Il TLS/mTLS è acceso, i segreti vengono rotati.
- ACL/account/quote (per-tenant).
- Idampotenza su concimatori, DLQ e retrai con jitter.
- Monitoraggio di lag/throughput/errori; alert su URP (Kafka), ridelivery-tempesta (NATS).
- Capacity dashboards: partition, storage, p99.
- Test di guasto nodi/zone, game-days, repliche/backfill.
- Sono documentate le chiavi di partizionamento e schema (Schema Registry/JSON Schema).
- I criteri retensico/compattazione/TTL sono coerenti con la compilazione.
- Le versioni di broker/client vengono aggiornate regolarmente; La compatibilità del protocollo wire è stata verificata.
17) Anti-pattern
Chiave hot (tutti gli eventi di un ID) → un flusso bollente. Sharding/buffer.
I retrai non sono idepotenti ad avere effetti di ripresa.
Messaggi enormi (MB-10) frammentazione/pausa GC. Memorizzare payload nell'oggetto, inviare collegamenti.
Miscelare RPC e streaming in Kafka è un ciclo di vita/ordine complesso.
come «DWH a lungo termine» non è il suo scopo; Conserva a lungo negli store di oggetti/colinvertebrati.
Nessun DLQ, nessun messaggio velenoso.
I dischi di → dimenticati sono pieni, fermate il cluster.
18) FAQ
Q: È possibile fare un'exactly-once "alla fine del pipline?
A: In pratica, efficacemente sì: Kafka (produttore idipotente + transazioni) e sink idipotenti (chiave, upsert). In NATS - attraverso Idempotence/Dedup nell'applicazione.
Q: Cosa scegliere per un milione di RPC piccoli/secondi?
A: NATS Core: microlattività, richiest-reply, connettori leggeri e queue-groups.
Hai bisogno di compattazione e snapshot?
A: Kafka с `cleanup. policy = compact ', chiave = aggregazione/risorsa.
Come si combatte il campo?
A: Aumentare il numero di partenze/worker, ridurre i tempi di lavorazione, batch e prefetch, ottimizzare la deserializzazione, rinforzare verticalmente i broker/unità.
Q: Multiregione e DR?
A: Kafka - 2/Cluster Linking, attivo passivo con . NATS — supercluster/leafnodes; JetStream mirroring/repliche per zona.
19) Riepilogo
Kafka e NATS chiudono diverse modalità: Kafka - registri eventi duraturi, throughput alto, transazioni e repliche; NATS è un pneumatico ultraleggero per ritardi bassi, RPC e semplice fan-out, con JetStream per la persistenza. Scegliere la semantica di spedizione, l'ordine e la retensione, la latitudine e i costi operativi. Progettate chiavi/partiture, retensioni, DLQ e osservabilità e l'architettura di eventi sarà prevedibile, scalabile e affidabile.