2012-10-15 46 views
3

我一直在构建一个实时通知系统。它是一个Web应用程序的一部分,但事件一旦发生就必须立即看到。长时间轮询并不是一种选择,因为当没有事件发生时,网络服务器将继续保持连接将会很昂贵,所以我不得不进行短期轮询。Web服务器容忍高客户端轮询率:牛仔与Yaws网络服务器

每个客户端每隔2秒就会访问Web服务器(这是一个相当高的速率)。当事件可用时,它们将作为JSON发送给JavaScript客户端。现在,这需要服务器设置来处理大量的短暂连接。我已经使用Yaws Web服务器实现了一个这样的系统。但是,由于Yaws启动了许多其他服务,它感觉很重,并且连接开始在超过30,000时被拒绝或中止(可能是因为我在Yaws运行的同一个Erlang虚拟机中运行一些ETS表[分开这些可能需要rpc:call/4,我担心会增加延迟])。我知道有操作系统特定的调整要做,而且已经完成。

如果很容易聚集几个Yaws实例,这不会成为问题。在Yaws中,我使用了一些appmods,并且我正在以REST方式做事。我认为牛仔web服务器可能会在这里增强一些功能。我以前没有使用过牛仔,但我已经使用过Misultin。看牛仔,它是一个完全成熟的OTP应用程序,它似乎很容易集群,并且轻量级,可能会增加整个系统可以处理的客户端数量。存储位于Mnesia上,我可以轻松分发这些内容以添加更多节点(可能通过复制),以便在每个Mnesia实例前都有一个Cowboy实例。

我的问题是:

  1. 是我的猜测是正确的,如果我从雅司切换到牛仔,我可能会显著提高性能?

  2. Yaws有一个清洁的API通过Appmods#arg{}记录。牛仔是否有这两件事情的相应(请说明)?

  3. 可以Cowboy处理文件上传吗?如果是这样,你认为哪个服务器(Yaws或牛仔)在频繁上传文件的情况下会更好?说明如何使用Cowboy完成文件上传。

  4. 可以在同一台机器上运行多个Yaws实例。你认为每个服务器(物理盒)创建许多Yaws实例并分配客户端负载将有助于吗?我需要知道如何做到这一点?

  5. 当我设置yaws.conf参数max_connections = nolimit时,我如何在牛仔中指定相同的?

现在,我跟着interview with Cowboy author和他讨论的原因牛郎比雅司病更轻巧。他说

最大的区别是使用二进制代替列表。通用接受者池是另一个。我可以列出很多其他的小差异,但我认为这些不是最有趣的。

,由于牛郎使用监听池库Ranch,它以某种方式与处理多个连接的能力较强,再加上使用的二进制文件,而不是列出的结束。

从采访中另一句名言:

由于我们使用的一个过程每个连接,而不是两个,和我们使用的二进制文件,而非列表,我们最终使用少了很多的内存比,无需用户干预的其他项目。牛仔也是懒惰的,除非需要,否则它不会做任何事情。所以我们没有太多内存,直到用户开始调用函数为止。

我想知道雅氏如何处理这种情况。不知何故,我的问题域需要轻量级的HTTP处理。实际上,与Mochiweb,Misultin或Cowboy相比,Yaws会导致更多的内存消耗。我最大的担忧是Yaws拥有最好的/最清洁的API,因此它使我们能够访问包含Erlang记录所需的所有内容,以便我们可以将它们自己排除出去,而不是其他具有多种外部提取功能的其他内容。即使是文档:Yaws文档也相当不错,直接。也许我需要看看更多的牛仔代码,如文件上传和简单的GETPOST请求处理。

否则,我之前提出的问题仍然是紧迫的问题。 Yaws非常好,但对于这种快速轻量化的短期高利率投票情况似乎有点过头,您怎么看?

+1

反对票应该带着“理由”来。每个需要其他意见的问题都被投下来。我想知道是什么原因。有人解释了为什么这个问题被拒绝投票。如果你没有答案,为什么不在这个页面上击败它呢?哈? –

+0

我不明白你写的这部分内容:“...雅各派启动了许多其他的服务......”从我所看到的,Yaws注册了8个进程,包括其监督者,记录者等。对我而言,这不符合“许多其他许多服务”的条件。 –

+0

你能解释你有什么麻烦,你正在聚集雅各实例吗? –

回答

3

你的30000拒绝限制听起来像是一个32K的限制很糟糕的地方。可以是32k的默认进程计数,也可以是文件描述符的某些系统限制等。你不应该排除限制是在内核方面的可能性。由于内核配置很难处理,我已经看到系统很容易达到极限。