我有多个(1000个)客户端连接到单个服务器并发送一些日志数据。
如有必要,服务器会分析数据并做出响应。
PUB
/ SUB
是一个方向(监控示例)
REQ
/ REP
无法识别对等方并专门回复对等方(更多用于ACK等等)。
我需要注册这些客户端,识别它们并在分析其日志后做出响应。
使用套接字,我有客户端套接字,接受后我可以使用该套接字响应,客户端可以在我连接的同一套接字上接收。
我在0mq的第一周没有在ZeroMQ中找到这样的东西。
ROUTER
套接字可以打印对等体的ID,但是如何使用该ID回复该对等体?
有没有更好的方法来解决这个问题?
答案 0 :(得分:4)
由于马斯洛的锤子:
“当你拥有的唯一工具(...想要使用)
是锤子时,每个问题都会开始类似于指甲。“
ZeroMQ是一套可爱的微调构建模块,具有普遍装备(根据它们在最终实现组合中将使用的传输类的中立性),可用于在一个高级别中重复使用它们分布式系统设计的逻辑&原型设计。
因此,期望非常PUB
/ SUB
,PAIR
/ 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克隆服务器对可能的高可用性方法然后返回到根,元素和细节。
答案 1 :(得分:0)
看起来有DEALER
/ ROUTER
模式,听起来很复杂,但可以与某些异步进行双向通信。
我还在等待有0mq经验的人的其他答案。
因为我不希望 DEALER
到.bind()
到任何静态端口。