Web服务器对高客户端轮询速率的容忍度:Cowboy vs. Yaws Web服务器

5
我一直在构建实时通知系统。它是Web应用程序的一部分,但事件必须在发生时立即显示出来。长轮询不是选项,因为当没有事件可用时,Web服务器保持连接会很昂贵,所以我选择了短暂的轮询。
每个客户端每2秒钟向Web服务器发送请求(这是相当高的速率)。当事件可用时,它们作为JSON发送到JavaScript客户端。现在,这需要一个服务器设置来处理大量的短暂连接。我已经使用Yaws Web服务器实现了这样一个系统。然而,由于Yaws启动了许多其他服务,它感觉很重,并且当连接超过30,000时,连接开始被拒绝或中止(也许是因为我正在运行一些ETS表格在同一个Erlang VM上运行Yaws [将它们分开可能需要rpc:call/4,这会增加延迟)。我知道有操作系统特定的调整要做,这些已经完成了。
如果可以很容易地将多个Yaws实例聚集起来,这将不是一个问题。在Yaws中,我使用了一些appmod,并且正在以RESTful的方式进行操作。我认为Cowboy web服务器可能会在这里提高效率。我以前没有使用过Cowboy,但我使用过Misultin。看看Cowboy,它是一个完整的OTP应用程序,似乎很容易进行聚类,并且由于其轻量级,可以增加整个系统所能处理的客户端数量。存储在Mnesia上,我可以轻松分发以添加更多节点(也许通过复制),以便每个Mnesia实例前面都有一个Cowboy实例。

我的问题是:

  1. 我猜测,如果我从Yaws切换到Cowboy,性能可能会显著提高,我的猜测正确吗?

  2. Yaws通过Appmods#arg{}记录具有清晰的API。Cowboy是否有这两个东西的等效物(请举例说明)?

  3. Cowboy能处理文件上传吗?如果可以,你认为在频繁文件上传的情况下使用哪个服务器(Yaws或Cowboy)更好?请说明如何使用Cowboy进行文件上传。

  4. 可以在同一台机器上运行多个Yaws实例。您认为每台服务器(物理盒子)创建多个Yaws实例并将客户端负载分布在这些实例之间是否有帮助?我需要了解哪些内容?

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

现在,我跟随Cowboy作者的采访,他讨论了Cowboy比Yaws更轻量级的原因。他说:

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

因为Cowboy使用监听器池库Ranch,它以某种方式具有处理更多连接的更高能力,再加上使用二进制而不是列表。

同一次采访中的另一句话:

由于我们针对每个连接使用一个进程而不是两个,并且我们使用二进制而不是列表,所以我们使用的内存比其他项目少得多,而无需用户干预。Cowboy也很懒惰,除非需要,否则它不做任何事情。因此,在用户开始调用函数之前,我们的内存很少。

我想知道yaws如何处理这种情况。在我的问题领域中,需要轻量级的HTTP处理。事实上,与Mochiweb、Misultin或Cowboy相比,Yaws将导致更多的内存消耗。我最担心的是,Yaws拥有最好/最清洁的API,它使我们可以访问包含所有所需内容的#arg {}作为Erlang记录,以便我们自己获取它们,而其他方法则需要大量提取功能。甚至文档:Yaws文档非常好而且易于理解。也许我需要查看更多Cowboy代码来处理文件上传和简单的GETPOST请求处理等问题。

否则,我之前提出的问题仍然是紧迫的问题。Yaws非常好,但似乎对于这种快速轻量级短暂高速率的投票情况来说有些过度,你怎么看?


1
一个踩的理由是必须要有的。每个需要其他意见的问题都会被踩。我想知道这背后的原因是什么。有人能解释一下为什么这个问题被踩吗?如果你没有答案,那为什么不离开这个页面呢?哈哈? - Muzaaya Joshua
1
我不理解你所写的这部分内容:“...yaws starts quite a number of many other services...” 从我所看到的,Yaws 注册了8个进程,包括它的监督器、日志记录器等。对我来说,这并不足以称之为“相当多的其他服务”。 - Steve Vinoski
1
你能解释一下在集群yaws实例中遇到了什么问题吗? - Steve Vinoski
我已经做了一些编辑。谢谢@Vinoski - Muzaaya Joshua
1
你可以考虑尝试新的Yaws自定义调度功能。你需要提供一个带有dispatch/1函数的调度器模块。它会得到一个像appmod一样的#arg{}记录,但你需要自己处理向socket写入响应的过程。更多细节请参见此提交。或者,你也可以在Yaws邮件列表上放置一个测试用例,以便我们查看。 - Steve Vinoski
1个回答

4

你提到的30000拒绝限制听起来很像某个地方的32k限制。这可能是默认进程数(32k),也可能是文件描述符等系统限制。不要排除限制在内核方面的可能性。由于内核配置可能非常难处理,我曾经看到系统很容易达到其极限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接