Я работаю над облаком 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>
Обсуждение:
Я ожидаю, что новый асинхр/API ждут в .net 4.5 быть таким же асинхронным, как JS в node.js и в значительной степени простым в использовании. Любые серьезные ошибки с этим допущением?
Какие настройки/оптимизации моей роли в Azure Web должны быть сделаны, чтобы максимизировать количество контуров?
Я слышал, что мне нужно увеличить максимальные соединения, поскольку по умолчанию используется только 12 * несколько ядер. Это правда, как это делается?
Должен ли я что-либо сделать, чтобы изменить пул потоков по умолчанию?
Любые другие важные советы/настройки/оптимизации?
Следует ли вообще отказаться от IIS? Есть некоторые «более скудные» server implementations, которые я могу разместить в роли рабочего. Может ли это значительно повысить производительность по сравнению с IIS? Это стоит того?
В целом, я на правильном пути? Есть ли лучший способ сделать это с помощью C# /. Net?
Некоторые называют этот тип реализации node.cs :) – talkol
IIS/ASP.NET делает все, что вам нужно изначально (асинхронная обработка и т. Д.), Не пытайтесь переписать его как «node.js» в обработчике , При этом вы можете использовать node.js на лазурном, если это то, что вы действительно ищете. –
@SimonMourier Я полагаюсь на IIS и .NET для всего, что мне нужно, это просто другая «упаковка». ASP.NET MVC и друзья включают в себя множество раздутых функций, таких как движок просмотра и движок маршрутизации, который я не хочу – talkol