每个生产者线程使用zmqPUSH套接字,而所有线程生产者使用专用zmq线程



ZeroMQ指南中明确指出,线程之间不得共享套接字。如果多个线程生产者需要通过zmq推送他们的输出,我会看到两种可能的设计模式:

  • 0mq插座/生产线螺纹
  • 单独螺纹中的单个0mq插座

在第一种情况下,每个线程都处理自己的事务。在后者中,您需要一个线程安全队列,所有生产者都向该队列写入,0mq线程从该队列读取并发送。

在这两种模式之间做出选择的因素是什么?每种方法的优缺点是什么?

很大程度上取决于有多少生产商。

如果只有少数,那么每个线程有一个套接字是可以管理的,并且效果很好。

如果有很多,那么具有单个套接字推送的生产者-消费者队列(实际上是队列的消费者和下游套接字的单个生产者)可能会更快。运行大量的套接字并非没有成本。

第一种情况的主要优点是更容易扩展到为每个生产者分离进程,每个进程都有自己的套接字。

我问了一个类似的问题。

你可以使用一个工作线程池,就像这样,每个工作线程都通过ThreadLocal有一个专用的0mq套接字,确保套接字在创建它们的线程中被使用和销毁

您还可以使用一个套接字池,可能有一个ArrayBlockingQueue作为支持,并在需要时获取/替换套接字。这种方法不如专用套接字方法安全,因为它在不同线程之间(同步)共享套接字对象;您应该没事,因为Java处理锁定,但这不是0mq推荐的方法。

希望它能帮助。。。

最新更新