Как отправить ACK-сообщение клиенту с сервера, используя NetMQ
Я использую NetMQ для отправки сообщений от многих клиентов на сервер, который получает сообщения и обрабатывает их. Если я использую шаблон pub/sub, я могу (ab) использовать сокет подписчика и использовать его для сервера, а клиенты будут издателями (обратный поток, не так ли?). Однако я не могу отправить подтверждающее сообщение клиентам.
Если я использую REQ/RESP
шаблон, я могу использовать сокет ответа для сервера и даже отправить сообщение подтверждения, которое может быть получено клиентом. Тем не менее, если сервер пропустит сообщение от клиента, я не могу переслать сообщение (после ожидания timespan
), потому что я получаю исключение
Req.XSend - не может отправить другой запрос
- даже после отключения клиентского сокета и его закрытия (кажется, что сокет сервера отслеживает его).
И, наконец, основываясь на документации, я не уверен, что Dealer/Router
это правильный шаблон для использования. Поскольку я почти уверен, что застрял в очень распространенной ситуации, есть ли способ реализовать этот сценарий с помощью NetMQ?
1 ответ
Вы застряли в очень распространенной проблеме, обычно называемой "Надежный запрос-ответ" на языке 0MQ.
В руководстве описано несколько подходов, первый - "ленивый пират". В нем вы используете пару сокетов REQ/RESP, как описано (хотя REQ/ROUTER будет работать так же хорошо, и, вероятно, лучше для более чем одного клиента). Решение состоит в том, чтобы избавиться от сокета, если ваш ACK истек, и создать новый.
Руководство отмечает, что замена ДИЛЕРА на REQ решит проблему, но добавляет необходимость отслеживать конверт самостоятельно. Если вам не нужна асинхронная отправка / получение на стороне клиента по какой-либо другой причине, я буду следовать их советам и придерживаться REQ/ROUTER.
Пример реализации этого шаблона можно найти на GitHub: https://github.com/NetMQ/Samples/tree/master/src/Pirate%20Pattern