使用c#和.net实现可扩展的类似于node.js的HTTP服务器

tal*_*kol 4 .net iis azure node.js azure-web-roles

我正在使用Azure云,并尝试实现主要是IO绑定的可伸缩HTTP服务器。

澄清:举个例子,假设服务器是一个“ blob代理”,即客户端连接,服务器从Azure存储下载一个blob并将其流式传输到客户端。而已。

我的目标当然是从一台计算机上压缩最多的并发客户端。

向node.js学习

看来node.js非常适合此类问题。服务器只做IO。节点是完全异步的,在一台计算机上可能达到10,000个并发。

我最终选择了使用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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

我的路由很简单Web.config

<system.webServer>
  <handlers>
    <add verb="*" path="*" name="MyHandler" type="MyWebRole.MyHandler" />
  </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

讨论:

  1. 我希望.net 4.5的新async / await API与node.js中的JS一样异步,并且非常易于使用。这个假设有什么严重的错误吗?

  2. 为了使并发数量最大化,应该对Azure Web角色进行哪些调整/优化?

    • 我听说我必须增加最大连接数,因为它默认仅为12 * num核心。这是真的,它是如何做到的?

    • 我应该做些什么来更改默认线程池吗?

    • 还有其他重要提示/调整/优化吗?

  3. 我应该完全删除IIS吗?我可以在工作角色中托管一些“更精简”的服务器实现。相对于IIS,这能否显着提高性能?值得麻烦吗?

  4. 总的来说,我走对了吗?有没有更好的方法用c#/。net做到这一点?

Aka*_*ava 5

  1. 是的,.NET 4.5的异步API的速度将与Node一样快,但是,由于Node是最低的服务器,因此它看起来总是更快,因为默认情况下,Node不管理会话以及IIS为各种功能提供的许多其他挂钩。IIS还提供了“应用程序域”等,以隔离不同的应用程序,每种此类功能都会使IIS的速度降低几位,Node实现的所有示例均未涵盖任何高级功能,这就是为什么它们看上去更快的原因。

  2. 您必须研究config,我确信它必须是可配置的,否则您可以删除Azure Web角色并移到Azure网站并创建Reserve Capacity,在其中可以完全自定义web.config,也可以简单地创建一个可以在任何级别配置整个IIS的VM。它是您的私人服务器。

  3. 不,丢弃IIS而不知道它能做些什么就是重新发明轮子,IIS庞大,并且它具有许多附加功能和许多安全性改进。您最终将创建一个服务器,其中包含许多您可能没有意识到的安全漏洞,但这可能是有害的。

  4. 异步API是您在C#中所能达到的最高水平,它具有许多优点,例如功能齐全的Visual Studio,Entity Framework和更高级的调试功能。使用Node或任何自定义实现,调试和创建通用例程将花费所有时间。相反,您可以为与IIS相关的开源开发做出贡献,因为它的许多部分现在都在Codeplex上可用。

带有ASP.NET 4.5 MVC的IIS,它也是完全异步的。您可以创建异步控制器和处理程序。实际上,大多数人都不知道从ASP.NET 2.0开始就可以使用异步编程了,唯一的问题是,编写异步逻辑很困难。将开发成本与开发时间进行比较,我们通常会忽略异步编程的好处,除非我们从所付出的时间中获得很高的回报。但是从.NET 4.5开始,asyncawait关键字都异步编程很容易制造。