Manutenção de clientes no ZMQ ROUTER
Como o soquete ZeroMQ ROUTER mantém suas conexões de clientes internamente.
O guia diz que cada cliente recebe um ID exclusivo, mas não está claro:
O que conta como cliente (cada máquina, um cliente diferente ou cada aplicativo conectado, diferente?)Existe um limite no número de solicitações recebidas de um cliente?O motivo é que estou testando o estresse com este código (dehttp://hintjens.com/blog:42) com 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;
}
Quando dado o comandoab -n 1000 -c 10 http://192.168.74.1:8080/
Ocasionalmente, ele termina bem, mas muitas vezes fica travado por algum tempo e, em seguida, termina bem ou falha comapr_pollset_poll: The timeout specified has expired (70007)
depois de algum número aleatório de mensagens (digamos, 300, 700 etc.)
A parte interessante é que, enquanto ab está suspenso (talvez aguardando resposta), se você abrir uma conexão diferente de uma máquina / navegador diferente, ela terá êxito. Como uma nova conexão de um navegador diferente é bem-sucedida, enquanto ab está por aí?
Então, imaginando se esse é um 'limite por conexão' do ROUTER ou algo mais acontecendo. Observe que o HWM é definido como 0.