【发布时间】:2013-05-15 14:30:51
【问题描述】:
我正在利用 ZeroMQ N 对 N 发布/订阅模型构建 POC。在我们的应用服务器中,当一个 http 请求得到服务时,如果线程从数据库中提取数据,它会使用该数据更新一个本地 memcache 实例。为了同步应用服务器集群中的其他 memcache 实例,请求线程使用 ZMQ 发布者发送带有数据的消息......所以问题是:什么策略是最有效的关于最小化套接字当应用程序有许多依赖于套接字发送消息的线程时创建/销毁开销?我们是否共享一个套接字池,是否为每个线程创建/销毁套接字等?
策略 1 - 线程管理的发布者套接字
在这种方法中,每个线程T1、T2 和T3 通过创建、建立连接、发送消息和最后关闭套接字来管理套接字对象(发布者)的生命周期。基于this,这当然是最安全的方法,但我们担心重复创建、连接和销毁套接字时的开销;如果开销对性能产生负面影响,我们希望避免它。
策略 2 - 发布者套接字对象池
在这种方法中,父进程(应用服务器)在启动时初始化一个 ZMQ 发布者池。当一个线程需要一个发布者时,它从对象池中获取一个,发送它的消息,然后将发布者返回到池中;相对于使用发布者的线程而言,创建、连接和销毁套接字的过程被消除了,但是对池的访问是同步以避免任何两个线程同时使用同一个发布者对象,并且这就是可能出现死锁和并发问题的地方。
我们没有对这两种方法进行分析,因为想先对 SO 测试做一个试金石。就数量而言,我们的应用程序不会发布“大量”消息,但可能有 100-150 个线程(每个应用服务器)同时需要发布消息。
所以,重申一下:当应用程序有许多依赖于发布者发送消息的线程时,什么策略是最有效的?
【问题讨论】:
-
线程不能重用自己的私有套接字吗?
-
不,这些是 HTTP 处理线程,由应用服务器管理;我会更新问题,谢谢。
-
编程语言/应用服务器是什么?
-
Java,在 Tomcat 或 Jetty 上
标签: java multithreading sockets connection-pooling zeromq