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

Vic*_*tor 5 c sockets zeromq

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

服务器分析数据并在必要时做出响应。

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

我需要注册这些客户,识别他们并在分析他们的日志后能够做出回应。

使用套接字,我有客户端套接字,在接受之后我可以使用该套接字进行响应,并且客户端可以在我连接到的同一个套接字上接收。

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

ROUTER socket 可以打印对等方的 id,但是如何使用该 id 回复该对等方?

有没有更好的方法来处理这个问题?

use*_*197 6

他们都没有——意思是没有一个!
. . . 而是在更高的抽象层次上使用更多的逻辑。

为什么 ?

因为马斯洛的锤子:

“当你拥有(……想要使用)的唯一工具
锤子时
每个问题都开始像钉子一样。”

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

因此,期望非常PUB/ SUBPAIR/PAIR或任何其他正式的可扩展通信原型原语将正确匹配系统要求,而忽略了核心优势,我们凡人已从真正的 Martin SUSTRIK 和 Pieter HINTJENS 的智能消息传递团队获得。

提议

可以想象以下模型概念:

使用:

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

  • 客户端.connect()-s 它的PUB角色,按需,并将自己介绍给监听SUB-role的服务器+ 移动日志数据并“挂起”或保持线路静默(在决定之前应该对扩展和性能问题进行现场测试这组架构问题)。

  • 服务器可能决定需要与 id# 散列的特定客户端进行一些临时对话,但不希望.bind()与静态端口# 关联的另一个公开公开的先验端口,因此服务器使用另一个.connect()-ed 角色,一个PUB,向 id# 散列的客户端(类似于启动端口敲击安全行为的软件方式),将系统范围内的相关开销、信令、电报的占用空间非常短,从而具有可接受的足迹,告诉它在哪里到.connect()服务器并解决额外的任务等(客户端重新发现和注册和维护是可行的,因此全局方案满足规定的要求,不暴露任何其他静态暴露给外部入侵者的端口)

  • 客户端有另一个.bind()准备好的SUB角色,订阅了监听服务器 id#-hashed 信号通知 + 设置指令,一个合适的客户端应该 -.connect()反对 - .bind()(而反向.bind()/.connect()方案只需要一点扩展的客户端重新发现维护)和服务器端信号,这种事后处理可能发生在单独的(甚至是一次性使用的(完全一次性的))临时通信基础设施(无论是XREQ/XREP或其他双边正式通信模式原型还是某种几个这样的智能编排的更智能的混合),它不需要服务器具有静态公开的端口,但足以用于临时服务器/客户端请求处理。

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

最好的下一步:

引用:)我的 0mq 的第一周”之后,最好的下一步可能是恕我直言,以获得更多的全局视图,这对于尝试使用 ZeroMQ 进行编码的前几件事来说可能听起来很复杂,但是如果您在至少跳转到第265页中的[代码连接,第1卷] [可asPdf >>> http://hintjens.wdfiles.com/local--files/main%3Afiles/cc1pe.pdf] ,如果不是的一步一步阅读的情况。

有史以来最快的学习曲线是首先对
Fig.60 Republishing Updates有一个未公开的视图
重新发布更新
和图
62 HA 克隆服务器对可能的高可用性方法,然后回到根源、元素和细节。


无论如何,享受 ZeroMQ 的强大功能,

可能会觉得在这里阅读其他与 ZeroMQ 相关的 Q/As 很有趣 >>>


Vic*_*tor 0

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

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

因为,我不想连接DEALER.bind()任何静态端口。