NATS публикует / подписывает подтверждения
Я делал несколько POC с NATS и потоковыми серверами NATS в течение последних нескольких дней. Я начал с сервера потоковой передачи NATS, написав Java-клиент для него и опубликовав / подписав сообщения на / от сервера потоковой передачи NATS, кластеризованного вместе с сервером NATS. NATS-потоковая передача довольно аккуратна с предоставлением подтверждения 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 (если я не пропустил это в документации).
Я знаю, что существует открытая проблема, чтобы получить возможности потоковой трансляции NATS и NATS, изложенные в одной таблице, на которую нужно сослаться, но пока это еще не сделано.
Предоставляет ли сервер NATS подтверждения при публикации сообщения на сервере NATS? Или подтверждение сообщения, подписанного одним из подписчиков?
1 ответ
Я знаю, если это было давно, и вам может быть не интересен ответ на данный момент, но вот он:
NATS Streaming теперь поддерживает кластеризацию.
Но вернемся к вашему вопросу о ядре NATS: подтверждение от сервера не отправляется. Это природа NATS, огонь и забыть. Теперь, если ваше отправляющее приложение должно знать, что сообщение было обработано подписчиком, вы можете использовать Запрос / Ответ. То есть подписчик, получающий сообщение, может отправить сообщение обратно в тему ответа входящего сообщения. Запросчик имеет возможность установить тайм-аут, чтобы указать, как долго ждать ответа. Затем он должен принять решение относительно того, что делать, если он не получил ответ: повторно отправить? сдаваться? Обратите внимание, что подписка, возможно, обработала запрос, и ответ был пропущен (либо сбой, проблема с сетью, истечение времени ожидания запроса), поэтому вам потребуется какой-то способ обнаружения того, что запрос уже обработан. Это верно и для NATS Streaming. Существует гарантия, по крайней мере, один раз, а не самое большее один раз.