每个客户端每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实例。
我的问题是:
我猜测,如果我从Yaws切换到Cowboy,性能可能会显著提高,我的猜测正确吗?
Yaws通过
Appmods
和#arg{}
记录具有清晰的API。Cowboy是否有这两个东西的等效物(请举例说明)?Cowboy能处理文件上传吗?如果可以,你认为在频繁文件上传的情况下使用哪个服务器(Yaws或Cowboy)更好?请说明如何使用Cowboy进行文件上传。
可以在同一台机器上运行多个Yaws实例。您认为每台服务器(物理盒子)创建多个Yaws实例并将客户端负载分布在这些实例之间是否有帮助?我需要了解哪些内容?
当我设置
yaws.conf
参数max_connections = nolimit
时,我该如何在Cowboy中指定相同的参数?
现在,我跟随Cowboy作者的采访,他讨论了Cowboy比Yaws更轻量级的原因。他说:
最大的区别是使用二进制而不是列表。通用接收器池是另一个区别。我可以列出很多其他小的区别,但我认为这些不是最有趣的。
因为Cowboy使用监听器池库Ranch,它以某种方式具有处理更多连接的更高能力,再加上使用二进制而不是列表。
同一次采访中的另一句话:
我想知道yaws如何处理这种情况。在我的问题领域中,需要轻量级的HTTP处理。事实上,与Mochiweb、Misultin或Cowboy相比,Yaws将导致更多的内存消耗。我最担心的是,Yaws拥有最好/最清洁的API,它使我们可以访问包含所有所需内容的由于我们针对每个连接使用一个进程而不是两个,并且我们使用二进制而不是列表,所以我们使用的内存比其他项目少得多,而无需用户干预。Cowboy也很懒惰,除非需要,否则它不做任何事情。因此,在用户开始调用函数之前,我们的内存很少。
#arg {}
作为Erlang记录,以便我们自己获取它们,而其他方法则需要大量提取功能。甚至文档:Yaws文档非常好而且易于理解。也许我需要查看更多Cowboy代码来处理文件上传和简单的GET
和POST
请求处理等问题。
否则,我之前提出的问题仍然是紧迫的问题。Yaws非常好,但似乎对于这种快速轻量级短暂高速率的投票情况来说有些过度,你怎么看?