消息经纪人
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和可观察性-您的事件体系结构将是可预测、可扩展和可靠的。