2011-04-02 108 views
1

我要告诉我必须解决的问题,并且如果我处于正确的路径中,我需要一些建议。多线程Windows服务 - Erlang

的问题是:

我需要创建一个接收请求Windows服务应用程序,并做一些动作。 (套接字通信)这个动作是执行一个脚本(可能在lua或perl中)。这个脚本模拟客户端的业务规则,在数据库中查询,在网站发出请求,然后向客户发送响应。

有3个强制性要求:

  1. 该服务将在同一时间收到很多请求。所以我想使用工作者的线程模型。
  2. 该服务的吞吐量必须很高。同一秒我会有很多请求。
  3. 低延迟:我必须很快响应这些请求。

每个请求都会生成一个日志条目。由于大I/O时间,我不能在脚本执行的同时在物理磁盘中写入这些日志条目。可能我会在内存中创建一个队列,其他的Threds会使用这个队列并写入磁盘。

未来,有可能两个工作者的线程必须改变消息。

我必须为此服务制定协议。我正在考虑使用Thrift,但我不知道涉及的开销。也许我会做我自己的协议。

为了编写windows服务,我想到了Erlang。这是个好主意吗?

有没有人有任何建议/提示来解决这个问题?哪种编写这项服务的语言更好?

+1

不知道“很多”,“高”和“非常快”的数量实际上等于多少,这是一个主观的问题。 – spender 2011-04-02 16:59:27

+0

@spender:是的,也准备好了,但是后来记得有时几乎不可能指定这个,甚至几乎不可能。 – 2011-04-02 17:28:31

+0

请求每秒:约1k每秒 延迟:约600毫秒。取决于脚本中实施的业务规则。 – 2011-04-02 18:40:26

回答

1

是的,如果您知道或准备学习,Erlang是一个不错的选择。使用Erlang,您不需要任何工作线程,只需使用Erlang风格实现您的服务器,并且您将自动接收多线程解决方案。

不知道如何将Erlang程序转换为Windows服务,但可能是可行的。

从多个线程写入相同的日志文件是不理想的,因为需要锁定。最好有一个log-entries队列(无锁?)和一个单独的线程(Erlang进程?),将它们写入文件。顺便说一句,你确定用另一种语言执行外部脚本要比写一个日志记录要快得多吗?

您怀疑自己的序列化库会比Thrift免费提供更好的性能。另一种选择是Google Protocol Buffers,有人声称速度更快。

理论上(!)Erlang解决方案可能不会提供您所需的性能。在这种情况下,考虑可编译的语言,例如C++和异步网络,例如Boost.Asio。但要准备好它比Erlang方式复杂得多。

+0

该脚本将执行客户业务规则。脚本执行后,客户希望看到脚本做出的决定。这就是为什么我需要一个日志文件。对于客户来说,最好将日志条目写入数据库,因为他们可以在线查询。 Erlang是否使用一个进程池来接收请求?或者每次提出请求时都会产生一个新进程?它有很好的表现吗?我可以实施流程池吗? – 2011-04-02 18:49:33

+0

1)最有可能你的脚本比你的核心逻辑花费的时间要长得多,所以你的核心性能不会成为瓶颈。 2)无需进程池,Erlang使用轻量级进程,您可以拥有数百万合理的良好性能。您只需为每个客户端连接创建(“产卵”)进程 – 2011-04-02 19:21:45

+0

但是,如果我有一个池,则无需创建进程。它只是从池中选择一个进程。表现会更好。我对吗?谢谢 – 2011-04-02 20:01:28