2017-02-12 108 views
0

我对ZMQ中1-n和多线程的概念效率感兴趣。ZMQ 1-n排队vs多线程

让我给一个conseptual问题开始:

我有20个客户端和一台服务器。 (我会使用推拉式套接字,但如果答案随代表,请求,经销商,路由器而改变,我会感兴趣)。

如果客户端有推送套接字和服务器拉,那么所有的消息进入服务器上的单拉。 ZMQ将推送消息公平地排队到服务器,并且上下文可以被赋予用于要使用的线程数目的初始化参数。

但是引擎盖下发生了什么?它轮询它们之间的输入或多线程通信。自己多线程会获得任何性能优势吗?

我可以看到三种方式使上述系统(20个客户端一台服务器)。

1)在服务器上使用一个拉式套接字并按下每个客户端。

2)在服务器上使用20个拉套接字,使用zmq poll来选择具有活动的套接字。客户端仍然都有一个推送套接字。

3)在服务器上使用20个自己的线程(例如20个线程)。客户有相同的20个推动插座(每个1个)。

我明白,不使用选项1即时通讯失去新加入的客户端和选项2的动态性质删除公平排队,但我只是对效率感兴趣。

这是我的问题,线程的客户?或只使用zmq 1-n?

+1

欢迎来到Stack Overflow。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+0

在[SE软件工程](http://softwareengineering.stackexchange.com/)上,您的问题似乎更好。 –

+0

@πάνταῥεῖ当引用其他网站时,通常很有帮助的是[交叉发布是皱眉了](http://meta.stackexchange.com/tags/cross-posting/info) – gnat

回答

0

在引擎盖下ZMQ正在利用像select(),epoll()等东西。这些后台线程运行zmqtp协议,用于传输消息,实现模式等。您的程序使用zmq_send(),zmq_recv()与zmq_poll()进行交互,而zmq_poll()本身也使用select ()。所以AFAIK的效率非常高,当没有任何事情发生时,所有东西都会被阻塞,而且自己多线程处理都没有什么好处。

这就是为什么IPC传输不能在Windows上工作的原因。 Windows上没有select()用于管道,而在* nix管道上,套接字,文件等都只是文件描述符,而select()则适用于它们。

Windows的这个功能是像Cygwin这样的主要PITA;他们通过在每个非套接字文件描述符中启动一个线程并轮询命名管道,串行端口等来在Windows上实现POSIX的select()。因此,在Cygwin中,您可以创建管道并将它们包含在select()的调用中,有很多线程轮询基础Windows管道,效率不高。 ZMQ作者选择不这样做。

如果在1)中服务每个客户端所用的时间比从客户端向服务器传输消息所用的时间更长,则只需执行2)或3)。请记住,所有这些都是您的以太网NIC,无论如何,一切都在经历着。在服务器上有更多的线程不会使以太网更快。

+0

嗨,感谢您的评论。我明白我只限于我的网络。我在服务器和客户端之间运行高带宽的10Gb连接,并且将几乎最大化吞吐量,尽可能多地发送数据,尽管我可以用人为的方式。所有的客户都会试图同时谈话并卸载他们的数据。这就是为什么我对效率感兴趣。如果不进行线程化,它将一次读取一个客户端。多线程他们会在parrellel中读取它们。那是我的问题。我希望他们一起被读出,而不是排队。速度是重中之重。 – Nolva

+0

听起来像你正在进入负载平衡模式http://zguide.zeromq.org/page:all#The-Load-Balancing-Pattern。在这里你有一个中间代理,并且为你发送的消息添加一些内容,以允许代理将正向消息和反向消息与客户/服务器相关联。您可以调整它以使用推拉。代理充当客户端的单一联系点,并将消息路由到多个服务器,并根据需要选择服务器。 – bazza

+0

谢谢,指导已经很好的阅读了很长时间。它实际上比这更复杂,(这个问题被简化为SO常规问题)。它更像是一个偏执狂的海盗组合,其分布式计算与客户端服务器输入.....其复杂..... Iv实际上已经离开了中介经纪人这是我的第一个停靠港,他们不是可扩展的。一个拥有数千台计算机的系统只会出现单个中间件/故障点,并且通过单个节点的数据传输速率将过高。我对第二个备份经纪人很有帮助。 – Nolva