#c# #.net #nginx #httplistener
#c# #.net #nginx #httplistener
Вопрос:
Я создаю веб-сервис, который должен обслуживать только json, и он должен быть масштабируемым.
У меня сложилось впечатление, что Nginx является более масштабируемым веб-сервером, чем IIS 7.5, и что им чрезвычайно просто управлять по сравнению с IIS. Кроме того, Nginx можно очень легко использовать для балансировки нагрузки между несколькими службами json, используя модуль upstream.
Поскольку мне нужно обслуживать только json, я чувствую, что ASP.Net и IIS — это перебор. Мне просто нужна очень простая маршрутизация и простой механизм authcookie, который я легко могу написать сам.
Прямо сейчас я использую MVC3, но чувствую, что он раздут, когда я обслуживаю только Json, и меня очень раздражает тот факт, что мне приходится писать пользовательские атрибуты аутентификации, чтобы создать политику запрета по умолчанию, создавать HttpModule, чтобы обойти перенаправление неавторизованных запросов WindowsFroms authentication по умолчанию, и в целом мне нужно много читать и учиться, чтобы оставаться под контролем фреймворка. Я также рассматривал WCF, но мой предыдущий опыт работы с этим заключался в том, что для моих нужд было слишком много наворотов и настроек, и о многом нужно было знать, чтобы оставаться под контролем.
Я предпочитаю простоту и хочу избежать «накладных расходов фреймворка», когда мне просто нужно обработать некоторый Http для простого, быстрого и масштабируемого асинхронного json-сервиса. Итак, я рассматриваю подобную настройку:
- Веб-сервер Nginx на платформе Linux, который балансирует нагрузку между веб-запросами и прокси-серверами к асинхронным службам json.
- Службы json написаны как службы Windows, использующие HttpListener для асинхронной обработки веб-запросов.
Что вы думаете об этой архитектуре?
РЕДАКТИРОВАТЬ: На самом деле я думаю, что было бы более эффективно использовать fastcgi из nginx в службы Windows вместо проксирования предварительных запросов http? Что вы думаете?
Комментарии:
1. вы привязаны к использованию реализации .net или вы вольны выбирать другую среду программирования? Потому что это выглядит так . net для этого немного излишен. Может быть nodejs.org лучше соответствует вашим требованиям.
2. Я привязан к языку C #, потому что предпочитаю статически типизированный и скомпилированный язык. На самом деле я нахожу, что написание большого сервера в node занимает слишком много времени по сравнению с выполнением этого на C #, потому что отлаживать код C # намного быстрее, потому что вы получаете большую помощь от компилятора и resharper.
Ответ №1:
Просто реализуйте ASHX — в основном IHttpHandler
для IIS, который действительно хорошо масштабируется, и большинство проблем, которые вы описываете, просто «уходят»… это дает вам полный контроль над всей обработкой запросов / ответов… хороший учебник см.http://www.dotnetperls.com/ashx
Комментарии:
1. Спасибо за ссылку. Полезно знать, но для моей текущей проблемы я хотел бы отделить веб-сервер от приложения. Я хотел бы услышать от кого-нибудь, кто пробовал что-то вроде того, что я описал.
2. @ssn (используете ли вы nginx для балансировки нагрузки, не оказывает никакого влияния на реализацию) — я сам внедрил какую-то службу Windows на основе HttpListener, я не уверен, что именно вы хотите знать … возможно, вы могли бы уточнить…
3. ОК. В принципе, я хотел бы знать, подходит ли общая архитектура, учитывая, что я не хочу использовать IIS или ASP.NET. Еще одна вещь, которую я рассматриваю, это использовать ли fastcgi или http-прокси (с httplistener) из NGINX в службы Windows. Я предполагаю, что использование fastcgi будет более эффективным, поскольку будут использоваться постоянные TCP-соединения. Прав ли я в этом предположении?
Ответ №2:
Мне кажется, что было бы более чем достаточно настроить простое веб-приложение, имеющее один обработчик запроса, который возвращает соответствующий ответ Json.
Возможно, вы захотите взглянуть на оптимизацию конвейера ASP .NET. Вы можете прочитать больше об этом и других ASP.Здесь оптимизация СЕТИ. Если обработка запросов невелика с точки зрения обработки, вы также можете захотеть увеличить ограничения потока. Это также рассматривается в статье, на которую ссылается.
С точки зрения Nginx, вы можете захотеть проверить, соответствует ли количество рабочих потоков вашему количеству процессоров.
Надеюсь, это поможет.
Комментарии:
1. Под простым веб-приложением вы подразумеваете ASP.NET веб-приложение?
2. Да. Для ваших целей я не уверен, будет ли заметная разница при сравнении MVC с Webforms.