Обслуживание клиентов в ZMQ ROUTER
Как сокет ZeroMQ ROUTER поддерживает свои клиентские соединения внутри.
В руководстве говорится, что каждый клиент получает уникальный идентификатор, но неясно:
Что считается клиентом (на каждой машине свой клиент или каждое подключенное приложение?)Есть ли ограничение на количество запросов, полученных от клиента?Причина в том, что я тестирую этот кодhttp://hintjens.com/blog:42) с ab:
#include "czmq.h"
int main(void)
{
zctx_t *ctx = zctx_new();
void *router = zsocket_new(ctx, ZMQ_ROUTER);
zsocket_set_router_raw(router, 1);
zsocket_set_sndhwm(router, 0);
zsocket_set_rcvhwm(router, 0);
int rc = zsocket_bind(router, "tcp://*:8080");
assert(rc != -1);
while (true)
{
// Get HTTP request
zframe_t *handle = zframe_recv(router);
if (!handle) break; // Ctrl-C interrupt
char *request = zstr_recv(router);
puts(request); // Professional Logging(TM)
free(request); // We throw this away
// Send Hello World response
zframe_send(&handle, router, ZFRAME_MORE + ZFRAME_REUSE);
zstr_send(router, "HTTP/1.0 200 OK\r\n""Content-Type: text/plain\r\n""\r\n""Hello, World!");
// Close connection to browser
zframe_send(&handle, router, ZFRAME_MORE);
zmq_send(router, NULL, 0, 0);
}
zctx_destroy(&ctx);
return 0;
}
Когда дано командуab -n 1000 -c 10 http://192.168.74.1:8080/
иногда он завершается нормально, но часто просто зависает на некоторое время, а затем либо завершается нормально, либо завершается с ошибкойapr_pollset_poll: The timeout specified has expired (70007)
после некоторого случайного числа сообщений (скажем, 300, 700 и т. д.)
Интересно то, что, пока ab зависает (возможно, ожидает ответа), если вы открываете другое соединение с другой машины / браузера, это успешно выполняется. Как удается установить новое соединение из другого браузера, в то время как ab просто зависает?
Итак, интересно, является ли это «лимитом на соединение» ROUTER или что-то еще происходит. Обратите внимание, что HWM установлен в 0.