在过去的几天里,我一直在用NATS和NATS流媒体服务器做一些POC。我从NATS-streaming服务器开始,为它编写了一个Java客户端,并向NATS-streaming服务器发布/订阅消息,与NATS服务器一起集群。neat 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服务器(而不是流)时,我找不到任何这样的AckHandlers (或其他任何东西),它们可以为我提供一个确认guid来表示消息已经成功发布。
NATS流服务器有很多我正在寻找的内置功能-例如,message acknowledgements,max_age (消息的TTL),durable subscriptions等,但它缺乏当前最新版本的集群功能。另一方面,NATS服务器提供集群功能,但我找不到NATS-streaming提供的其他特性(除非我在文档中遗漏了它)。
我知道有一个open issue可以让NATS与NATS流功能在一个单独的表格中列出供参考,但到目前为止还没有完成。
当消息发布到NATS服务器时,NATS服务器是否提供确认?或者由订阅者之一订阅的消息的确认?
发布于 2018-10-01 23:08:20
我知道已经有很长一段时间了,你现在可能对答案不感兴趣,但它是这样的:
NATS流现在支持群集。
但是回到你关于核心NATS的问题:没有从服务器发回确认。这就是NATS的本质,一发即忘。现在,如果您的发送应用程序需要知道消息已被订阅者处理,您可以使用请求/回复。也就是说,获得消息的订阅者可以将消息发送回传入消息的回复主题。请求者可以选择设置超时来指示等待响应的时间。然后,它必须做出决定,如果没有得到答复,该怎么办:重新发送?放弃?请注意,订阅可能已经处理了请求,而应答丢失(可能是崩溃、网络问题、请求或只是超时),因此您需要某种方式来检测请求是否已经处理。NATS流媒体也是如此。有一个至少一次的保证,而不是至多一次。
https://stackoverflow.com/questions/48112393
复制相似问题