1

在过去的几天里,我一直在用 NATS 和 NATS 流服务器做一些 POC。我从 NATS 流服务器开始,为相同的 Java 客户端编写了一个 Java 客户端,并向/从 NATS 流服务器发布/订阅消息,与 NATS 服务器一起集群。NATS-streaming 非常简洁,guids当流媒体服务器收到来自发布者的消息时提供确认。我通过注册一个AckHandler并像这样使用它来实现这一点:

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();
        }
    });

但是,当我开始查看 NATS 服务器(不是流式传输)时,我找不到任何这样的 AckHandler(或其他任何东西)可以向我提供确认guid消息已成功发布。

NATS 流服务器有很多我正在寻找的内置功能 - 例如,message acknowledgementsmax_age消息的 TTL)durable subscriptions等。但它缺乏当前最新版本的集群功能。另一方面,NATS 服务器提供了集群功能,但我找不到 NATS-streaming 提供的其他功能(除非我在文档中错过了它)。

我知道有一个未解决的问题是要在单个表中列出 NATS 与 NATS 流功能,以供参考,但目前还没有完成。

当消息发布到 NATS 服务器时,NATS 服务器是否提供确认?还是确认其中一个订阅者订阅了一条消息?

4

1 回答 1

1

我知道是否已经很长时间了,此时您可能对答案不感兴趣,但这里是:

NATS Streaming 现在支持集群。

但回到你关于核心 NATS 的问题:服务器没有发回确认。这就是 NATS 的本质,即火即忘。现在,如果您的发送应用程序需要知道消息已被订阅者处理,您可以使用请求/回复。也就是说,收到消息的订阅者可以将消息发送回传入消息的回复主题。请求者可以选择设置超时来指示等待响应的时间。然后它必须决定如果它没有得到答复该怎么办:重新发送?放弃?请注意,订阅可能已经处理了请求并且错过了回复(崩溃、网络问题、请求者刚刚超时),因此您需要某种方式来检测请求是否已被处理。NATS Streaming 也是如此。

于 2018-10-01T15:08:20.110 回答