You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于NATS服务器是否提供消息发布与订阅确认机制的技术咨询

NATS与NATS Streaming消息确认及功能差异的实测解答

我最近刚针对NATS及NATS Streaming服务器做了一系列POC测试,刚好能解答你的疑问:

核心问题的直接答案

1. NATS原生服务器的发布确认

NATS原生采用的是**"fire-and-forget"(即发即弃)**的核心设计,默认情况下没有像NATS Streaming那样的高层级AckHandler机制来返回消息唯一GUID作为发布确认。不过有两个基础确认方式:

  • 启用NATS客户端的verbose模式后,服务器会在收到消息后返回一个简单的确认信号,但不会提供消息的唯一标识;
  • 部分版本的NATS支持pub ack配置(需要服务器端开启),能让客户端确认服务器已接收消息,但同样没有专属的消息GUID。

2. NATS原生的订阅者接收确认

NATS原生本身没有内置的“消息被订阅者成功接收”的确认机制,这类需求需要你在业务逻辑层面自行实现——比如让订阅者收到消息后,主动向指定主题发送一条回执消息,由发布者监听该主题来确认送达。

我的POC测试细节

我之前用Java客户端对接集群部署的NATS Streaming时,确实可以通过注册AckHandler获取到流服务器返回的消息确认GUID,代码示例如下:

guid[0] = sc.publish("produceQueue", payload, new AckHandler() {
    @Override
    public void onAck(String nuid, Exception ex) {
        LOGGER.debug("Received ACK for guid: {}", nuid);
    }
    System.out.flush();
    latch.countDown();
});

这里的nuid就是NATS Streaming为每条消息生成的唯一标识,用来确认消息已被服务器持久化处理。

两者的关键功能差异总结

根据我的测试和文档调研,两者的核心特性对比可以整理为:

  • NATS Streaming
    • 自带消息发布/订阅的高层级确认机制
    • 支持消息TTL(通过max_age配置)
    • 支持持久订阅、消息重放等可靠性特性
    • 最新版本不支持集群部署,这是目前的主要局限
  • NATS原生服务器
    • 原生支持集群部署,具备高可用性和横向扩展能力
    • 性能更高、延迟更低,适合高吞吐量场景
    • 但缺少Streaming的消息持久化、专属确认、TTL、持久订阅等特性(这些都需要基于原生NATS自行开发上层逻辑)

另外我也留意到,社区确实有需求希望官方能推出一份明确的功能对比表格,但目前这个需求还没有落地。

内容的提问来源于stack exchange,提问作者Addle Pate

火山引擎 最新活动