我应该为连接到单个服务器的多个客户端使用哪种双向ZeroMQ模式?

时间:2016-09-16 16:13:15

标签: c sockets zeromq

我有多个(1000个)客户端连接到单个服务器并发送一些日志数据。

如有必要,服务器会分析数据并做出响应。

PUB / SUB是一个方向(监控示例) REQ / REP无法识别对等方并专门回复对等方(更多用于ACK等等)。

我需要注册这些客户端,识别它们并在分析其日志后做出响应。

使用套接字,我有客户端套接字,接受后我可以使用该套接字响应,客户端可以在我连接的同一套接字上接收。

我在0mq的第一周没有在ZeroMQ中找到这样的东西。

ROUTER套接字可以打印对等体的ID,但是如何使用该ID回复该对等体?

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:4)

他们都没有 - 意思不是一个人!
。 。 。而是在更高的抽象层次上使用更多的'em和一些逻辑。

为什么?

由于马斯洛的锤子:

  

“当你拥有的唯一工具(...想要使用)
锤子时,每个问题都会开始类似于指甲。“

ZeroMQ是一套可爱的微调构建模块,具有普遍装备(根据它们在最终实现组合中将使用的传输类的中立性),可用于在一个高级别中重复使用它们分布式系统设计的逻辑&原型设计。

因此,期望非常PUB / SUBPAIR / PAIR或任何其他正式可扩展通信原型基元将符合系统要求,而不是核心我们凡人从真正的Martin SUSTRIK& Pieter HINTJENS的智能短信团队。

提案

可以想象以下模拟概念:

是:

  • 服务器.bind() - s并处理所有客户端都知道的一个SUB端口,该端口已经足够好地接收所有“log” - 从所有id#处理的数据 - 散列客户端(并忽略任何其他数据入口 - 即使是旧版本的ZeroMQ实现SUB - PUB / SUB原型的一侧过滤也可以接受这一点服务器节点上的性能负载)。 (当然,有人可能会反对,可能还有其他要求,以便更好地处理或避免完全使用DDOS-atacks等,但让我们在这个模型中保持微不足道)

  • 客户端.connect() - 按需定义PUB角色,并将自身介绍给侦听SUB - 角色+移动日志数据的服务器“悬挂“或保持线路静音(在确定这组架构问题之前,应对比例和性能问题进行现场测试)。

  • 服务器可能决定要求与id#-hashed特定客户端进行一些临时对话,但不希望由与静态端口关联的另一个.bind()公开显示先验端口#,因此服务器使用另一个.connect() - ed角色,PUB,发送ad-hoc非常短,因此具有可接受的系统范围相关开销的足迹,信令,电报到id# -hashed客户端(类似于软件方式启动端口敲击安全行为),告诉它.connect()到服务器的位置并解决额外任务等(客户端重新发现和注册和维护是可行的这种方式,所以全局方案符合规定的要求,不暴露任何其他静态暴露给外部入侵者的端口)

  • 客户端有另一个.bind() - 就绪SUB角色,订阅了收听服务器ID#-hashed信号公告+设置说明,适当的客户应该.connect() - 反对 - .bind()(反向.bind() / .connect()方案只需要一点扩展的客户端重新发现维护),并且在服务器端信号上,此类事后处理可能发生在一个单独的(甚至是一次性使用的(完全一次性的))ad-hoc通信基础设施(无论是XREQ / XREP还是其他双边形式通信模式原型或某种更智能的混合几个这样的,智能协调的),它不需要服务器有一个静态暴露的端口,但足以进行特殊的服务器/客户端请求处理。

对草图模型不满意? ......毫无疑问,这里很原始

最佳下一步:

之后 (引用:)我的第一周0mq ”可能做的最好的下一步是恕我直言更多的全局视图,对于尝试使用ZeroMQ进行编码的前几个事情可能听起来很复杂,但是如果你at least jump to the page 265 [Code Connected, Volume 1] [available asPdf >>> http://hintjens.wdfiles.com/local--files/main%3Afiles/cc1pe.pdf ] ,如果不是一步一步地阅读。

最快的学习曲线是首先在图60
重新发布更新 {上显示未公开的视图{3}}
图62 HA克隆服务器对可能的高可用性方法然后返回到根,元素和细节。

无论如何,享受ZeroMQ的权力和 Republishing Updates

答案 1 :(得分:0)

看起来有DEALER / ROUTER模式,听起来很复杂,但可以与某些异步进行双向通信。

我还在等待有0mq经验的人的其他答案。

因为我不希望 DEALER.bind()到任何静态端口。