2013-08-14 2 views
3

Я работаю над облаком Azure и пытаюсь реализовать масштабируемый HTTP-сервер, который в основном IO-bound.Реализация масштабируемого node.js-подобного HTTP-сервера с C# и .net

Уточнение: Чтобы иметь пример, предположим, что сервер является «прокси-сервером blob», то есть клиент подключается, сервер загружает blob из Azure Storage и передает его клиенту. Вот и все.

Моя цель состоит в том, чтобы сжать максимум одновременных клиентов с одной машины.

Учась node.js

Похоже, Node.js очень естественно подходит для такого рода проблемы. Весь сервер делает это IO. Узел полностью асинхронный и, вероятно, может достигать нескольких 10000 согласных на одной машине.

Я в конечном счете выбрал против node.js в пользу C# и .net framework, и я пытаюсь реализовать аналогичную стратегию с тем, что может предложить C#. Я не пытаюсь реплицировать узел - только его подход.

Моя C# реализация на Azure

В настоящее время у меня есть Azure облачный сервис, содержащий тонкий Web Role на IIS. Вот 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> 

Обсуждение:

  1. Я ожидаю, что новый асинхр/API ждут в .net 4.5 быть таким же асинхронным, как JS в node.js и в значительной степени простым в использовании. Любые серьезные ошибки с этим допущением?

  2. Какие настройки/оптимизации моей роли в Azure Web должны быть сделаны, чтобы максимизировать количество контуров?

    • Я слышал, что мне нужно увеличить максимальные соединения, поскольку по умолчанию используется только 12 * несколько ядер. Это правда, как это делается?

    • Должен ли я что-либо сделать, чтобы изменить пул потоков по умолчанию?

    • Любые другие важные советы/настройки/оптимизации?

  3. Следует ли вообще отказаться от IIS? Есть некоторые «более скудные» server implementations, которые я могу разместить в роли рабочего. Может ли это значительно повысить производительность по сравнению с IIS? Это стоит того?

  4. В целом, я на правильном пути? Есть ли лучший способ сделать это с помощью C# /. Net?

+1

Некоторые называют этот тип реализации node.cs :) – talkol

+0

IIS/ASP.NET делает все, что вам нужно изначально (асинхронная обработка и т. Д.), Не пытайтесь переписать его как «node.js» в обработчике , При этом вы можете использовать node.js на лазурном, если это то, что вы действительно ищете. –

+0

@SimonMourier Я полагаюсь на IIS и .NET для всего, что мне нужно, это просто другая «упаковка». ASP.NET MVC и друзья включают в себя множество раздутых функций, таких как движок просмотра и движок маршрутизации, который я не хочу – talkol

ответ

1

Я бы серьезно предложил не изобретать колесо здесь. В последних версиях IIS поддерживаются веб-порты, и асинхронный запрос/ответ доступны в течение некоторого времени.

Что касается ваших комментариев о раздувании, вы все равно можете быть довольно скудным. Что касается механизма просмотра и механизма маршрутизации, то у вас нет , чтобы использовать это, и в какой момент, что именно вы действительно хотите? Вы можете зарегистрировать/использовать другой или настраиваемый механизм просмотра. Часть рендеринга - такой небольшой уровень взаимодействия, о котором почти не стоит упоминать, особенно в сочетании с кэшированием вывода.

Это действительно зависит от того, что вы пытаетесь выполнить, что предлагает NodeJS. Крупнейшая торговая точка NodeJS способна обрабатывать много тысяч одновременно подключенных пользователей для значительных нагрузок, связанных с событиями IO &. Главным образом файловая система/db/services для IO и WebSockets для привязки событий.

Без профилирования конкретного приложения невозможно дать совет. Учитывая, что в ASP.NET + IIS (последняя версия) много. Если вы собираетесь изобретать колесо, тогда важно точно определить, что именно нужно.


В этом случае, это выглядит, как вы хотели, чтобы сделать тип CDN нагрузки в IIS, в этом случае вы, вероятно, следует использовать модуль HTTP, если вы желаете, чтобы прилипать к IIS.

Я бы предложил вам изучить загруженный CDN или обратный прокси-сервер кэширования, если вам не нужно ограничивать ресурсы для аутентифицированных пользователей. С большой интеграцией IIS + .Net вы не собираетесь обойти много раздува, о котором вы говорите иначе, при этом придерживайтесь IIS + .Net.

Помимо этого, Microsoft уже предлагает решение CDN, поддерживаемое хранилищем azure blob. Вероятно, это ваш лучший выбор, если вам нужна аутентификация, я считаю, что есть методы для этого. В любом случае вы, вероятно, можете делать то, что хотите, с .Net и C# либо через интерфейсы ASP.Net MVC или WebService ... нет необходимости в просмотрах.


Как и в сторону, мне очень нравится node.js себя, и вы также можете использовать лак перед несколькими Node.js экземпляров за свои услуги в вопросе. Azure поддерживает Linux-виртуальные машины, и мы использовали Ubuntu и Docker, которые работали очень хорошо.

3
  1. Да, Асинхронный API из .NET 4.5 будет столь же быстро, как узел будет, однако, поскольку узел является голым минимумом сервера, он всегда будет казаться быстрее, так как по умолчанию Node не удается сессии и многой другой которые IIS предоставляют различные функциональные возможности. IIS также предоставляет области приложений и т. Д., Чтобы изолировать разные приложения, каждая из таких функций замедляет IIS на несколько бит, все примеры реализации узлов не охватывают функциональность высокого уровня, поэтому они кажутся быстрее.

  2. Вам нужно будет изучить конфигурацию, я уверен, что она должна быть настраиваемой, в противном случае вы можете удалить Azure Web Role и перейти на Azure Web Site и создать резервную емкость, в которой вы можете полностью настроить web.config или вы можете просто создать виртуальную машину, где вы можете настроить весь IIS на любом уровне. Его собственный сервер.

  3. Нет, отбрасывая IIS, не зная, что все, что он может сделать, это изобретать колесо, IIS огромен, и у него много аддонов и множество улучшений безопасности. В итоге вы создадите сервер с множеством дыр в безопасности, которые вы не можете реализовать, но это может быть вредно.

  4. Async API - это насколько вы можете пойти на C#, и вместе с ним вы получаете много преимуществ, таких как полнофункциональная Visual Studio с платформой Entity Framework и с более продвинутыми возможностями отладки. С помощью Node или любой пользовательской реализации отладка и создание общих процедур будут потреблять все ваше время. Вместо этого вы можете внести свой вклад в разработки с открытым исходным кодом, связанные с IIS, поскольку многие его части теперь доступны на Codeplex.

IIS с ASP.NET 4.5 MVC, полностью асинхронный. И вы можете создавать асинхронные контроллеры и обработчики. На самом деле, большинство людей не знают, что асинхронное программирование доступно с ASP.NET 2.0, единственной проблемой было то, что писать асинхронную логику сложно. Сравнивая стоимость разработки с временем разработки, мы часто игнорируем преимущества асинхронного программирования, за исключением случаев, когда нам выплачивается очень высокая отдача от нашего времени. Но начиная с .NET 4.5, async и await ключевые слова сделали асинхронное программирование очень простым.