2009-01-10 36 views
7

我正在设计一个Perl中的多层应用程序,我想知道可用于我的各种IPC机制的优缺点。我正在考虑处理中等大小的数据,通常是几十千字节,但高达几兆字节,并且负载非常轻,最多每分钟有几百个请求。在Perl中适用于中等数据的最佳IPC机制是什么?

我的主要担忧是可维护性和性能(按此顺序)。我不认为我需要扩展到多个服务器,或者从我们的主平台(RHEL)移植,但我认为这是需要考虑的问题。

我能想到的下列选项:

  • 临时文件 - 简单化,大概在速度和存储需求方面最坏的选择
  • UNIX域套接字 - 不便于携带,不能扩展
  • 互联网插座 - 便携式,可扩展
  • 管道 - (?)便携式,不能扩展

Consid由于可扩展性和可移植性不是我的主要关注点,我需要了解更多。什么是最佳选择,为什么?如果您需要更多信息,请发表评论。


编辑:我会尽力给予响应更详细地ysth's questions(警告,文字的墙壁如下)

  • 是读/写器在一一对一的关系,还是更复杂的东西?
  • 如果读者不在那里或者忙碌,你想要发生什么?
  • 反之亦然?
  • 你对你的期望用法有什么其他信息?

在这一点上,我正在考虑采用三层方法,但我不确定每层中会有多少个进程。我想,我需要向左侧少向右多个进程,但也许我应该有一刀切同一个号码:

 
.---------.   .----------.  .-------. 
| Request | -----> | Business | -----> | Data | 
| Manager | <----- | Logic | <----- | Layer | 
`---------'   `----------'  `-------' 

这些名字仍然是通用的,可能不会使其进入以这些形式实施。

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

它发送数据有关请求到执行日志记录业务逻辑,取决于业务规则授权等

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

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

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

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

无论如何,这是相当冗长,因为我仍然在早期的设计,我可能还是有一些糊涂的想法在里面。我提到的一些可能与的IPC系统使用的问题相关。我愿意接受关于设计的其他建议,但我试图将问题限制在范围之内(例如,也许我应该考虑折叠到两层,这对IPC来说更简单)。你怎么看?

回答

4

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

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

最后,有IPC :: PubSub,它可能适合你。

+0

非常感谢!我是ho ping来获得一些有用的Perl资源。 – 2009-01-11 01:22:44

4

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

3

UNIX域套接字可以通过unices移植。它不会比管道轻便。它比IP套接字更高效。

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

消息队列也将是一个可能性,但你必须改变内核选项它来处理这样的大消息。否则,他们有很多事情的理想界面,恕我直言,他们大大未被充分利用。

我普遍认为,使用现有的解决方案比建立自己的东西更好。我不知道你的问题的具体情况,但我建议你看看CPAN的IPC部分

+0

谢谢!你是对的,共享内存和消息队列甚至没有发生在我身上。 – 2009-01-11 02:13:17

6

如果你现在还不确定你的具体要求,试着想一个简单的界面你可以编码,即任何 IPC的实现(无论是临时文件,TCP/IP或其他)需要支持。然后你可以选择一个特定的IPC风格(我会从最简单和/或最容易调试的任何东西开始 - 可能是临时文件)并使用它来实现接口。如果结果太慢,则使用例如TCP/IP。实际上,实现接口并不涉及太多的工作,因为您基本上只是将调用转发给某个现有的库。

问题是,您有一个高级任务来执行(“从程序A向程序B传输数据”),它或多或少独立于它的执行细节。通过建立接口并对其进行编码,如果需要更改实施,您将与主程序隔离,并将其与的更改分离。

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

2

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

读者/作者是一对一的关系,还是更复杂的东西? 如果读者不在场或者忙碌,你想要发生什么?反之亦然? 你有什么其他信息关于你想要的用法?

+0

感谢您的回复,我为问题添加了更多细节。 – 2009-01-11 12:48:58

2

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

对于排队的请求(“请做到这一点,非常感谢!”):BeanstalkdBeanstalk::Client使用JSON序列化魔豆队列中的请求

Thrift也可能是值得探讨取决于你的应用程序。

相关问题