相关疑难解决方法(0)

ZeroMQ 多线程:按需创建套接字还是使用套接字对象池?

我正在构建一个利用 ZeroMQ N 到 N 发布/订阅模型的 POC。从我们的应用服务器,当一个 http 请求被服务时,如果线程从数据库中提取数据,它会用该数据更新本地 memcache 实例。要应用服务器集群中同步其他内存缓存的情况下,请求线程发送与使用ZMQ发行该数据的消息......这样的问题是:战略是什么最有效的关于减少套接字创建/ destory开销当应用程序有许多线程依赖套接字发送消息?我们是否共享套接字池,我们是否为每个线程创建/销毁套接字等?

策略 1 - 线程管理的发布者套接字
在这种方法中,每个线程 , T1,T2T3管理套接字对象(发布者)的生命周期,方法是创建它、建立连接、发送消息,最后关闭套接字。基于,这当然是最安全的方法,但是我们担心重复创建、连接和销毁套接字时的开销;如果开销对性能产生负面影响,我们希望避免它。

在此处输入图片说明

策略 2 - 发布者套接字对象池
在这种方法中,父进程(应用服务器)在启动时初始化一个 ZMQ 发布者池。当一个线程需要一个发布者时,它从对象池中获取一个发布者,发送它的消息,然后将发布者返回给对象池;对于使用发布者的线程,消除了创建、连接和销毁套接字的过程,但对池的访问是同步的,以避免任何两个线程同时使用相同的发布者对象,这就是死锁和并发问题的地方可能会出现。

我们没有对任何一种方法进行分析,因为想先对 SO 测试做一个试金石。关于数量,我们的应用程序不会发布“大量”消息,但可能有 100-150 个线程(每个应用服务器)同时需要发布消息。

ZMQ 发布者对象池

因此,重申一下:当应用程序有许多依赖于发布者发送消息的线程时,在最小化开销同时强调性能方面,哪种策略最有效

java sockets multithreading connection-pooling zeromq

5
推荐指数
1
解决办法
3637
查看次数

使用ZeroMQ消息的线程间通信

我试图zeroMQ用作在多个线程之间实现消息传递系统的方法.我尝试了下面的代码,但它不起作用; 具体而言zmq_recv,每个线程中的调用不会等待/阻止任何消息被执行.

你能帮我解决这段代码吗?

我正在使用Linux OS和gcc

最好的祝福

AFG

    static void *
    worker_routine (void *context) {
        // Socket to talk to dispatcher
        void *receiver = zmq_socket (context, ZMQ_REP);
        zmq_connect (receiver, "inproc://workers");
        while (1) {

            zmq_msg_t request;
            zmq_msg_init( &request );
            zmq_recv( receiver, &request, 0 );
            printf ("Received request\n");
            // Do some 'work'
            usleep (1000);
            // Send reply back to client
            zmq_send (receiver, &request, 0);
        }
        zmq_close (receiver);
        return NULL;
    }

    int main (void) {

    void *context = zmq_init (1); …
Run Code Online (Sandbox Code Playgroud)

c zeromq

2
推荐指数
1
解决办法
3404
查看次数

标签 统计

zeromq ×2

c ×1

connection-pooling ×1

java ×1

multithreading ×1

sockets ×1