我正在使用 Azure 云并尝试实现一个主要是IO-bound的可扩展 HTTP 服务器。
说明:举个例子,假设服务器是“blob 代理”——这意味着客户端连接,服务器从 Azure 存储下载一个 blob 并将其流式传输到客户端。而已。
我的目标当然是从一台机器上挤出最大的并发客户端。
向 node.js 学习
似乎 node.js 非常适合此类问题。服务器所做的只是 IO。Node 是完全异步的,在一台机器上可能会达到几万个并发。
我最终选择了反对 node.js 来支持 c# 和 .net 框架,并且我正在尝试使用 c# 提供的类似策略。我不是想复制节点——只是它的方法。
我在 Azure 上的 c# 实现
目前,我有一个 Azure 云服务,其中包含 IIS 上的瘦 Web 角色。这里是MyHandler.ashx
:
public class MyHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
CloudBlockBlob blob = GetBlockBlobReference(...);
await blob.DownloadToStreamAsync(context.Response.OutputStream);
}
}
我有这个简单的路由Web.config
:
<system.webServer>
<handlers>
<add verb="*" path="*" name="MyHandler" type="MyWebRole.MyHandler" />
</handlers>
</system.webServer>
讨论:
我希望 .net 4.5 的新 async/await API 与 node.js 中的 JS 一样异步,并且非常易于使用。这个假设有什么严重的错误吗?
为了最大化并发数,应该对我的 Azure Web 角色进行哪些调整/优化?
我听说我必须增加最大连接数,因为它默认只有 12*num 个核心。这是真的吗,它是如何完成的?
我应该做些什么来改变默认线程池吗?
还有其他重要的提示/调整/优化吗?
我应该完全放弃 IIS 吗?我可以在 Worker Role 中托管一些“更精简”的服务器实现。相对于 IIS,这会显着提高性能吗?值得麻烦吗?
总的来说,我在正确的轨道上吗?有没有更好的方法来使用 c#/.net 做到这一点?