JetStream 是什么?
JetStream 是 NATS 的“持久化流式子系统”。简单说:原生 NATS 是超快的内存 Pub/Sub(更像“广播”),而 JetStream 在此之上提供 消息持久化、重试与回放、消费控制和背压 等能力,用来做“至少一次投递”的可靠消息流。
⸻
它能解决什么问题?
• 消息不丢:写入磁盘/副本(RAFT),宕机可恢复。
• 重试与死信:失败自动重投、达到上限进 DLQ。
• 回放与追溯:可按时间/序号重放历史事件(事件溯源、审计)。
• 背压与速率控制:消费者按需拉取(pull)或推送(push)+ 窗口/心跳/流控。
• 队列消费/水平扩展:多个消费者副本竞争同一流的消息(work queue)。
• 顺序与去重:每条消息有序列号,支持去重窗口。
• KV / 对象存储:JetStream 之上提供 Key-Value 与 Object Store 原语(做配置、模型/音频等大对象存取)。
典型场景:任务队列、事件驱动微服务、IoT 遥测、CDC 事件总线、TTS/ASR/LLM 工作流编排、审计日志、回放测试等。
⸻
核心概念(1 分钟速览)
• Stream(流):定义要持久化的主题集合(subjects)、存储(内存/文件)、保留策略(时间/条数/容量)。
• Consumer(消费者):订阅流的“读取视图”,控制ACK 策略(显式/自动)、最大重投、超时时间、推/拉模式、从何处开始(所有、新消息、最后、按主题)。
• ACK 与重试:显式 ack() 表示处理成功;nak() 或超时会重投;超过 max_deliver 可进 DLQ。
• 保留策略:Limits(按配额)、WorkQueue(每消息仅投递一次给某个消费者)、Interest(按订阅兴趣)。
⸻
何时用 / 何时不用
• 用 JetStream:需要可靠投递、重试/回放、消费节流。
• 用原生 NATS:只要超低时延的临时事件(“过了就算了”),比如 UI 实时信令。
⸻
最小 Python 示例(创建流、发布、拉取消费)
import asyncio, json, nats
from nats.js import api as js_api
async def main():
nc = await nats.connect("nats://127.0.0.1:4222")
js = nc.jetstream()
# 1) 创建 Stream(幂等)
try:
await js.add_stream(js_api.StreamConfig(
name="ORDERS",
subjects=["orders.*"],
storage=js_api.StorageType.FILE, # 文件持久化
max_age=js_api.parse_duration("72h") # 保留 72 小时
))
except Exception:
pass # 已存在
# 2) 发布持久化消息
ack = await js.publish("orders.created", json.dumps({"id": "o-1001"}).encode())
print("stored:", ack.stream, ack.seq)
# 3) 创建/使用拉取消费者(手动 ACK,失败会重投)
sub = await js.pull_subscribe(
subject="orders.*",
durable="orders-workers",
stream="ORDERS",
config=js_api.ConsumerConfig(
ack_policy=js_api.AckPolicy.EXPLICIT,
deliver_policy=js_api.DeliverPolicy.NEW,
max_deliver=5, # 最多重投 5 次
ack_wait=js_api.parse_duration("10s")
)
)
msgs = await sub.fetch(batch=1, timeout=1.0)
for m in msgs:
print("recv:", m.subject, m.data.decode())
await m.ack() # 处理成功
await nc.drain()
asyncio.run(main())
推送(push)消费者也支持:指定 deliver_subject,服务端主动推送;再配合 队列组 即可负载均衡。
⸻
生产要点
• 部署:nats-server -js,生产启用 集群 + RAFT 副本 + TLS/NKEY/JWT。
• 流与消费者参数:max_age、max_msgs、max_bytes、ack_wait、max_deliver、flow control、idle heartbeat。
• 回压策略:拉模式 fetch() 控制速率;推模式配置 max_ack_pending/流控心跳。
• 可观测性:/jsz、/varz 监控端点 + NATS CLI;记录处理时延与重投次数。
• 死信队列:max_deliver 触顶后重发到 dlq.* 或使用消费者的 republish 设置。
⸻
一句话总结:
JetStream = NATS 的“持久化与可控消费”层。它把 NATS 从“极速内存广播”升级为“可持久、可重试、可回放的事件流平台”,用在你需要可靠消息和任务编排的地方最合适。
1234

被折叠的 条评论
为什么被折叠?



