【问题标题】:What's the best IPC mechanism for medium-sized data in Perl? [closed]Perl 中中型数据的最佳 IPC 机制是什么? [关闭]
【发布时间】:2010-09-30 16:54:45
【问题描述】:

我正在使用 Perl 设计一个多层应用程序,我想知道我可以使用的各种 IPC 机制的优缺点。我正在研究处理中等大小的数据,通常为几十 KB,但最多可达几兆字节,并且负载非常轻,每分钟最多几百个请求。

我主要关心的是可维护性和性能(按此顺序)。我认为我不需要扩展到一台以上的服务器,或者从我们的主平台 (RHEL) 移植,但我认为这是需要考虑的事情。

我可以想到以下选项:

  • 临时文件 - 过于简单,在速度和存储要求方面可能是最差的选择
  • UNIX 域套接字 - 不可移植,不可扩展
  • Internet 套接字 - 便携、可扩展
  • 管道 - 便携,不可扩展 (?)

考虑到可扩展性和可移植性不是我最关心的问题,我需要了解更多信息。什么是最好的选择,为什么?如果您需要更多信息,请发表评论。


编辑:我将尝试提供更多详细信息以回复 ysth's questions(警告,文字墙如下)

  • 读者/作者是一对一的关系,还是更复杂的关系?
  • 如果读者不在或忙,您希望作者怎么办?
  • 反之亦然?
  • 您还有哪些其他有关您希望使用的信息?

此时,我正在考虑采用三层方法,但我不确定每一层有多少进程。我认为我需要在左侧有更多的流程,在右侧有更少的流程,但也许我应该有相同的数字:

.---------。 .---------。 .--------。 |请求 | -----> |商业 | -----> |数据 | |经理 |

这些名称仍然是通用名称,可能不会以这些形式进入实现。

请求管理器负责监听来自不同接口的请求,例如 Web 请求和 CLI(响应时间很重要)和电子邮件(响应时间不太重要)。它执行日志记录并管理对请求的响应(以适合请求类型的格式呈现)。

它将有关请求的数据发送到业务逻辑,该业务逻辑根据业务规则执行日志记录、授权等。

然后,业务逻辑(如果需要)从 数据层 请求数据,该数据层可以与(最常见的)内部 MySQL 数据库或我们团队无法控制的其他数据源通信(例如,我们组织的主要 LDAP 服务器,或我们的 DB2 员工信息数据库等)。这主要是一个简单的包装器,它以统一的方式格式化数据,以便在业务逻辑中更容易处理。

然后信息流回请求管理器进行展示。

如果,当数据向右流动时,阅读器很忙,对于交互式请求,我想简单地等待一段合适的时间,如果我没有获得该数量的访问权限,则返回超时错误时间(例如“稍后再试”)。对于非交互式请求(例如电子邮件),轮询系统可以简单地退出并在下一次调用时重试(可能每 1-3 分钟一次)。

当数据流向另一个方向时,不应该有任何等待情况。如果在尝试返回左侧时其中一个进程已经死亡,我真正能做的就是登录并退出。

无论如何,这很冗长,而且由于我仍处于早期设计阶段,因此我可能仍有一些混乱的想法。我提到的一些内容可能与使用哪个 IPC 系统的问题无关。我对设计的其他建议持开放态度,但我试图将问题限制在范围内(例如,也许我应该考虑分解为两层,这对于 IPC 来说要简单得多)。你有什么想法?

【问题讨论】:

    标签: perl ipc


    【解决方案1】:

    除此之外,临时文件还有其他问题。我觉得网袜真的是最好的选择。它们有据可查,正如您所说,可扩展且可移植。即使这不是核心要求,您也几乎可以免费获得它。套接字很容易处理,同样有大量的文档。您可以在库中构建您的数据共享机制和协议,而无需再次查看!

    【讨论】:

      【解决方案2】:

      临时文件(和相关的东西,如共享内存区域)可能是一个糟糕的选择。如果你想在一台机器上运行你的服务器而在另一台机器上运行你的客户端,你将需要重写你的应用程序。如果您选择任何其他选项,至少语义基本相同,如果您以后需要在它们之间切换。

      不过,我唯一真正的建议是不要自己写这个。在服务器端,你应该使用 POE(或 Coro 等),而不是自己在套接字上做select。此外,如果您的界面将是 RPC-ish,请使用 CPAN 中的 JSON-RPC-Common/ 之类的内容。

      最后,还有 IPC::PubSub,它可能对你有用。

      【讨论】:

      • 非常感谢!我希望能接触到一些有用的 Perl 资源。
      【解决方案3】:

      UNIX 域套接字可跨单元移植。它的便携性不亚于管道。它也比 IP 套接字更有效。

      无论如何,您错过了一些选项,例如共享内存。有些人会将数据库添加到该列表中,但我会说这是一个相当重量级的解决方案。

      消息队列也是一种可能,尽管您必须更改内核选项才能处理如此大的消息。否则,它们对于很多事情都有理想的界面,恕我直言,它们的使用率很低。

      虽然我普遍同意使用现有解决方案比构建自己的解决方案要好。我不知道您的问题的具体情况,但我建议您查看 CPAN 的 IPC 部分

      【讨论】:

      • 谢谢!没错,我什至没有想到共享内存和消息队列。
      【解决方案4】:

      如果您目前不确定您的确切要求,请尝试想一个您可以编写代码的简单接口,即任何 IPC 实现(无论是临时文件、TCP/IP 还是无论如何)需要支持。然后,您可以选择特定的 IPC 风格(我会从最容易和/或最容易调试的任何东西开始——可能是临时文件)并使用它来实现接口。如果结果太慢,请使用例如实现接口。 TCP/IP。实际上实现接口并不涉及太多工作,因为您基本上只是将调用转发到一些现有的库。

      关键是您有一个高级任务要执行(“将数据从程序 A 传输到程序 B”),它或多或少独立于其执行方式的细节。通过建立接口并对其进行编码,您将主程序与更改隔离,以防您需要更改实现。

      请注意,您不需要使用任何重量级的 Perl 语言机制来利用具有接口的想法。你可以简单地拥有例如3 个不同的包(用于临时文件、TCP/IP、Unix 域套接字),每个包都导出相同的方法集。选择要在主程序中使用的实现相当于选择 use 的模块。

      【讨论】:

        【解决方案5】:

        有很多不同的选择,因为其中大多数更适合某些特定情况,但您并没有真正提供任何可以识别您的情况的信息。

        读者/作者是一对一的关系,还是更复杂的关系? 如果读者不在或忙,你希望作者怎么办?反之亦然? 关于您想要的用途,您还有哪些其他信息?

        【讨论】:

        • 感谢您的回复,我已在问题中添加了更多详细信息。
        【解决方案6】:

        对于“交互式”请求(在等待响应(异步或非异步)时保持连接打开):HTTP + JSON。JSON::XS 速度非常快。每个人都可以使用 HTTP,并且很容易进行负载平衡、调试、 ...

        对于排队的请求(“请这样做,谢谢!”):BeanstalkdBeanstalk::Client。使用 JSON 序列化 beanstalk 队列中的请求。

        Thrift 也可能值得研究,具体取决于您的应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-28
          • 2014-08-04
          • 2014-06-27
          • 2015-11-25
          • 1970-01-01
          • 2010-09-09
          • 2010-12-12
          • 1970-01-01
          相关资源
          最近更新 更多