【问题标题】:Asynchronous tasks. Which architecture? (Or pattern in zeroMQ)异步任务。哪种架构? (或 zeroMQ 中的模式)
【发布时间】:2012-10-26 19:39:21
【问题描述】:

我希望 Linux(服务器)主机上的一个应用程序与 VM 中 Win7(客户端)上的应用程序通信。选择的库是 ZeroMQ。但是如何管理异步任务呢?

我举个例子: VM 中的应用程序以任意间隔生成任务并将它们发送到 Linux 机器。这将处理它们,但需要一些时间来回答。此时 REQ/REP 模式的套接字被阻塞,来自 WinApp 的传入任务无法转发到 LinuxApp。我应该如何解决这个问题?这一般是如何解决的,即使没有 0MQ。我是否必须同时连接服务器和客户端并建立两个连接?

要求:

  • 客户端是一个独特的任务生成器。
  • 服务器为每个连接的客户端创建一个工作线程。
  • 服务器在客户端和工作线程之间建立唯一的连接。(一些隧道)
  • ->(每个客户端-工作线程对之间的请求/请求通过一个套接字)
  • 服务器必须立即转发传入的任务。
  • 服务器必须能够处理多个客户端(因此连接到 WT)。

因此不可能实现 REQ/REP/REQ/REP/... 序列。

【问题讨论】:

    标签: c++ networking network-programming client-server zeromq


    【解决方案1】:

    查看ZMQ Guide 中描述的几种模式,看看其中一种是否比简单的REQ/REP 更适合。

    一般来说,您在 linux 机器上的服务器似乎需要实现 ROUTER/DEALER 模式,它将传入的任务转发给一组工作人员。

    与传统的基于套接字的客户端/服务器解决方案相比,ZMQ 有自己的拓扑结构。其他解决方案可能是实现基于套接字的服务器,该服务器使用线程池转发传入任务。

    更新: 由于您一直在精确满足您的要求,我认为majordomo 模式可能是您实现目标的一个良好且可靠的起点。正如@gvd 在他的 cmets 中提到的那样,可能有更好的拟合模式。

    【讨论】:

    • 见以下链接zguide.zeromq.org/…
    • @gvd LRU 真的吗?!?我的第一个想法是相当的。像majordomo,但根据客户要求(同时有多个),很可能是矫枉过正。
    • 这也行。您还可以像 Mongrel2 那样组合几种模式(推/拉和发布/订阅)
    • @gvd 是的,ZMQ 有一个非常细粒度的模式目录,它提供了许多可能的解决方案。有时这使得从这些中选择一个非常困难。恕我直言,如果没有其他东西真正适合的话,LRU 只是一个逃生点。
    • 很抱歉,但我很难理解 LRU 和 SOR 是如何适合这种情况的。也许是因为我的非母语英语。但我偶然发现了Asynchronous Client-Server。这听起来很合适。
    【解决方案2】:

    正如 DevNoob 所说,异步客户端服务器模式听起来很适合您。

    “LRU”表示最近最少使用,但我已从指南的最新文本中删除了该术语,并改用“负载平衡”。由于目标是在一组工作人员之间进行负载平衡...

    【讨论】:

      【解决方案3】:

      我知道您提到 ZMQ 作为您选择的库,但我可以谦虚地建议 Akka (www.akka.io) 吗? Akka 有一个 ZQM 扩展,我们有很好的经验,因此您可以轻松地在其传输机制(基于网络)和 ZMQ 之间进行转换。它实现了 Actor 模型,更重要的是,它为跨工作角色的异步处理提供了“询问”和“告知”。在消息传递速度方面,Akka 似乎也与 ZMQ 之类的竞争相当有利,并且在我的经验中记录得更好。

      Akka 没有的一件事是跨语言支持,但我们现在使用 ZMQ 扩展来实现这一点。事实证明,ZMQ 和 Akka 的结合确实是一个非常强大和灵活的平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多