什么是JetStream,有什么作用吗?

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 从“极速内存广播”升级为“可持久、可重试、可回放的事件流平台”,用在你需要可靠消息和任务编排的地方最合适。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值