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