过去几天我一直在使用NATS和NATS流服务器做一些POC。我开始使用NATS流服务器,为NATS流媒体服务器编写一个Java客户端,并发送/订阅消息,与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服务器(不是流媒体)时,我找不到任何可以向我提供确认guid
的AckHandler(或其他任何内容)来表示消息已成功发布。
NATS流媒体服务器具有许多内置功能,我正在寻找 - 例如message acknowledgements
,max_age
(消息的TTL),durable subscriptions
等。但它缺乏当前最新版本的集群功能。另一方面,NATS服务器提供群集功能,但我找不到NATS流提供的其他功能(除非我在文档中错过了它)。
我知道有一个open issue来获取NATS与NATS流功能,这些功能在一个表中列出,但尚未完成。
当消息发布到NATS服务器时,NATS服务器是否提供确认?或者确认其中一个订阅者正在订阅的消息?
答案 0 :(得分:0)
我知道是否已经很长时间了,此时您可能对答案不感兴趣,但这是:
NATS Streaming现在确实支持群集。
但是回到您对核心NATS的问题:服务器没有发回确认。这就是NATS的本质,一劳永逸。现在,如果您的发送应用程序需要知道该消息已被订阅者处理,则可以使用“请求/答复”。也就是说,收到消息的订户可以将消息发送回传入消息的Reply主题。请求者可以选择设置超时,以指定等待响应的时间。然后,如果未收到答复,则必须决定如何处理:重新发送?放弃?请注意,订阅可能已经处理了请求,并且错过了答复(崩溃,网络问题,请求者刚刚超时),因此您将需要某种方式来检测请求已被处理。 NATS流媒体也是如此。至少有一次保证,而不是最多一次。