多线程Windows服务 - Erlang

时间:2011-04-02 16:55:18

标签: windows erlang latency thrift throughput

我将告诉我必须解决的问题,如果我走在正确的道路上,我需要一些建议。

问题是:

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

有3项强制性要求:

  1. 该服务将同时收到大量请求。所以我想使用worker的线程模型。
  2. 该服务必须具有较高的吞吐量。我会在同一时间内收到很多请求。
  3. 低延迟:我必须非常快速地回复这些请求。
  4. 每个请求都会生成一个日志条目。我不能在脚本执行的同时在物理磁盘中写入这些日志条目,因为I / O时间很长。可能我会在内存中创建一个队列,其他人将使用此队列并在磁盘上写入。

    将来,两个woker的线程可能需要更改消息。

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

    要编写Windows服务,我在想Erlang。这是个好主意吗?

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

1 个答案:

答案 0 :(得分:1)

是的,如果您已经了解或准备好学习,Erlang是一个不错的选择。使用Erlang,您不需要任何工作线程,只需以Erlang方式实现您的服务器,您将自动收到多线程解决方案。

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

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

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

理论上(!)Erlang解决方案可能无法满足您的要求。在这种情况下,请考虑可编译语言,例如C ++和异步网络,例如Boost.Asio。但要做好准备,它比Erlang方式复杂得多。