消息經紀人
1)為什麼消息經紀人
經紀人按時間/速度/可靠性釋放生產者和制造商:- 緩沖和平滑峰,逆沖器。
- 獨立縮放讀/寫。
- 事件的可觀察性和復制(復制)。
- 建築模式:活動驅動器,CQRS,活動源,outbox/inbox。
2)基本模型和術語
2.1 Kafka(邏輯模型)
Topik → parties(有序的徽標)→ concumers的正交。
消費者集團:閱讀並行,分期平衡。
按時間/範圍重組;按鍵壓縮。
語義:最小值為at-least-once,在設置時為effectively exactly-once(等效生產商+交易)。
順序:黨內保證。
2.2 NATS(主題/主題,低延遲)
具有層次結構和Weildcarts的主題(「foo」,「foo」。>`).
模式:pub/sub,queue-groups(帶工作分配的粉絲),request-reply(快速RPC)。
Core NATS-短期,超低潛伏期;JetStream-持續性/重生/重播。
順序:通過最佳努力,沒有強有力的全球保證;使用JetStream-在流上排序,但是在發生故障時可能會進行罕見的重新排序。
3)交付語義和一致性
異位性和異位性是應用/合成器的責任,即使在Kafka中是「exactly-once」的情況下也是如此。
4)順序,分期付款和鑰匙
Kafka
消息密鑰的選擇將聚會定義→強大的本地順序。
Ключи: `aggregate_id`, `tenant_id`, `order_id`.避免使用熱鍵。
平衡:N批次≈閱讀並發水平。
NATS
在Core中,平衡使queue-group。
在JetStream中,Stream按子項排列;專註於低延遲的寬泛粉絲/粉絲。
5)重生,繼電器與堆肥
Kafka
Retention: `retention.ms/bytes`.
Compaction:存儲「按鍵的最後一個值」(適用於snapshot/keshey/sag)。
Replay:任何制造商可以「推開」正交。
JetStream
Streams: 文件/memori後端,時間存儲策略/字節/消息數。
消費者:pull/push,durable/ephemeral,按主題前綴過濾器。
Replay:重復或讀取從開頭/不像是序列(序列)。
6)交易,outbox和一致性
Kafka
Idempotent Producer (`enable.idempotence=true'):雙重保護。
交易:多個批次的原子記錄+消費者-offsets commit →沒有「漏洞」的閱讀過程寫作模式。
Transactional Outbox:在單個DB 交易中記錄業務事件和outbox行,worker在Kafka中發布。
NATS
沒有Kafka中的「跨流」交易;使用outbox/inbox和Idempotable consumers (keys, dedup stor)。
7) RPC和請求-響應
RPC的kafka不舒服(高超頭,順序/答案更復雜)。使用異步命令/事件。
NATS:非常適合請求回復(miliecunds, corolations, taymouts)。
go resp, err:= nc. Request("profile. get", []byte(`{"id":42}`), 200time. Millisecond)
8)操作和拓撲
8.1 Kafka
集群:經紀人+ZooKeeper(舊版本之前)或KRaft(新元數據)。
復制:跨區域RF≥3、ISR/控制器。
多區域:MirrorMaker 2/Cluster Linking;具有沖突策略的資產或資產。
磁盤/網絡容量:從「throughput × retention × replicas」計數。
8.2 NATS
集群:許多節點,超級集群(地理分布),用於外圍設備/邊緣的leafnodes。
JetStream:在節點集上放置流(放置),復制(R=1..5)。
WAN:可預見的低延遲,輕量級聯合。
9)安全性
Kafka
TLS (mTLS), SASL: SCRAM, OAuthBearer.
ACL到拓撲/組/事務。
靜止加密(OS/驅動器)+網絡策略。
NATS
nkey/JWT身份,帳戶語句,主題ACL。
節點和客戶端之間的mTLS。
租戶隔離(帳戶)+限制。
10)可觀察性和性能指標
Kafka
Брокер: `BytesIn/Out`, `RequestQueue`, `UnderReplicatedPartitions`, GC/FS stats.
Topik/party: 「logEndOffset」, consumer lag(關鍵)。
制片人/制片人:retrai,'batch。size`, `linger.ms`, `fetch.min.bytes",錯誤。
工具:JMX,巡航控制(重新平衡),計劃註冊。
NATS/JetStream
服務器:conn/msgs/sec,RTT,CPU/mem,慢消費者檢測。
JetStream: per stream/consumer — lag, redeliveries, acks, storage bytes.
監視:內置endpoint, nsc/adm-CLI, dashbords。
11)性能和調音
Kafka
大蹦床和'linger。MS提高了通量並壓縮了p99。
壓縮功能(lz4/zstd)可節省網絡/磁盤。
num.按消費者/內核數量分組,但不過量(超頭)。
驅動器:NVMe是首選的,XFS/EXT4 「noatime」。
NATS
小信息,許多化合物是規範;保持queue組「寬」。
JetStream: tune `max_ack_pending`, pull vs push, size of batches.
Backpressure: `FlowControl`, `IdleHeartbeat`, server-side limits.
12)集成模式
Outbox/Inbox(在Kafka和NATS中)。
SAGA:事件編排;「saga_id+step」的祖先。
Change Data Capture (CDC): Debezium → Kafka;在NATS中,是「來自DB觸發器/邏輯的發布者」的模式。
Stream processing: Kafka Streams/Flink/Spark;NATS是第三方處理器/功能,即JetStream消費者。
Dead Letter Queue(DLQ)和retry policy(指數backoff+jitter)。
13)配置示例
13.1 Kafka: topik創作和制作人
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:等效處理(草圖)
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)選擇Kafka vs NATS: 快速地標
需要Kafka →的繼電器、長重建、堆肥、重型流過程。
需要快速的RPC、微觀潛能的粉絲/粉絲、簡單的操作、edge/IoT → NATS (Core)。
我們需要持久性+粉絲出口,但沒有重型「登錄」平臺→ NATS JetStream。
Kafka →嚴格的密鑰和交易順序。
15)容量規劃(簡化)
Kafka
1.帶寬:'inbound_MBps × RF × retention_days × 86400 '→驅動器。
2.分期付款: 「target_concurrency」 ×庫存1。5–2×.
3.網絡:p99+復制+壓縮制作人。
NATS/JetStream
1.消息/秒和平均大小→通過。
2.Retention×replicas → storage.
3.消費者限制(ack-pending,redeliveries),CPU進行序列化。
16)安全操作: 支票單
- TLS/mTLS打開,秘密輪換。
- ACL/帳戶/配額(每種配額)。
- 在消費者,DLQ和帶有噴射器的中繼上的冪等。
- 監測lag/throughput/錯誤;URP(Kafka),重定向風暴(NATS)上的異常值。
- Capacity dashboards:分期付款,storage, p99。
- 節點/區域故障測試,遊戲日,繼電/後退。
- 已記錄了黨派和計劃密鑰(Schema Registry/JSON Schema)。
- 還原/復合/TTL政策與合規性一致。
- 經紀人/客戶版本定期更新;wire協議兼容性已驗證。
17)反模式
熱鍵(所有ID事件)→一個「沸騰」流。硬化/緩沖。
無止境的復仇者→雙重效果。
巨大的消息(MB-十個)→ GC碎片/暫停。將payload存儲在對象中,發送鏈接。
在Kafka中混合RPC和流媒體→復雜的生命周期/順序。
JetStream作為「持久的DWH」 →錯誤的;長期存儲在對象/結柱堆棧中。
沒有DLQ →「有毒」消息無限期旋轉。
被遺忘的重建→磁盤已滿,群集停止。
18) FAQ
Q:在吹笛的結尾可以做「exactly-once」嗎?
答:在實踐中-有效地是:Kafka(偶數生產商+交易)和偶數合成器(鑰匙,upsert)。在NATS中-通過應用程序中的冪等/去勢。
Q: 百萬個小型RPC/秒有什麼選擇?
答:NATS核心:微觀潛能,請求替換,輕連接,queue-groups。
Q:需要堆積和敲擊狀態嗎?
A: Kafka с `cleanup.policy=compact',key=聚合/資源。
問:如何處理滯後?
答:增加批次/經銷商數量,減少加工時間、修理和預處理時間,優化去消毒,垂直強化經紀人/光盤。
Q:多區域和DR?
答:Kafka-MirrorMaker 2/Cluster Linking,與RPO≈sekundy的資產通氣。NATS — supercluster/leafnodes;JetStream鏡像/副本跨區域。
19)結果
Kafka和NATS關閉了不同的模式:Kafka是耐用的事件日誌,高通量,事務性和反射;NATS是用於低延遲,RPC和簡單風扇外部的超輕型輪胎,而JetStream則用於持久性。選擇來自傳遞語義,順序和延續,潛伏期和運營成本。設計密鑰/批次、重構、DLQ和可觀察性-您的事件體系結構將是可預測、可擴展和可靠的。