ZMQ ROUTER中的客户端维护

时间:2014-04-26 00:50:28

标签: web zeromq

ZeroMQ ROUTER套接字如何在内部维护其客户端连接。

指南说每个客户都获得一个唯一ID,但不清楚:

  1. 什么算作客户端(每台机器不同的客户端或每个连接的应用程序不同?)
  2. 客户收到的请求数量是否有限制?
  3. 原因是,我正在使用ab:

    对此代码(来自http://hintjens.com/blog:42)进行压力测试
    #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/时,它偶尔会很好地完成,但很多时候它会挂起一段时间,然后在完成一些随机数量的消息(例如,300之后)完成正常或失败apr_pollset_poll: The timeout specified has expired (70007) 700等。)

    有趣的是,当ab挂起(可能正在等待响应)时,如果你从不同的机器/浏览器打开一个不同的连接,它就会成功。来自不同浏览器的新连接如何成功,而ab只是闲逛?

    所以,想知道这是否是ROUTER的“每个连接限制”或其他事情。注意,HWM设置为0.

1 个答案:

答案 0 :(得分:0)

我也一直在进行基准测试,但是使用与此处给出的相同代码的python版本。 [https://gist.github.com/malexer/8664997]。它的工作正常,我甚至测试了100000个请求,也很好。也许你可以试一试。 如果您发现问题的答案可能也可以通知我们。

您的第一个问题的答案是每个连接的应用程序都算作一个客户端并具有唯一ID。我设计了一个聊天服务器,其中多个客户端连接到路由器Socket - 每个客户端都有一个唯一的ID。