Потоковая передача с Node.js или любым другим решением Comet - PullRequest
9 голосов
/ 18 октября 2010

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

Я ищу альтернативы, но все, что я нашел, требовало запуска процессов на сервере.

Некоторые подробности о проекте.

  • За один раз будет подключено около 25 человек
  • В идеале все должны видеть обновления одновременно, как только они станут доступны.
  • Он будет работать в среде Windows, поэтому решения C # / .NET предпочтительнее, чем PHP.

У кого-нибудь есть идеи, может ли node.js справиться с этим или какими-либо другими решениями?

Ответы [ 4 ]

9 голосов
/ 27 октября 2010

Проблема заключается в том, что традиционные веб-серверы используют подход «поток за сокетом» для обработки одновременных пользователей, что не всегда оптимально для методов комет / длинных опросов.(Однако в более новых версиях IIS есть способ подключения ваших собственных обработчиков соединений, о которых я расскажу ниже.)

Для традиционных веб-серверов чаще всего цель состоит в том, чтобы получить соединение, обслуживать пользователя.как можно быстрее, и перейдите к следующему соединению.Если соединение задерживается на долгое время, то это потому, что оно, вероятно, выполняет что-то интенсивное, например, большую загрузку или большой запрос, но в целом активно использует ЦП, поэтому многопоточная модель работает довольно хорошо.

В комете (длительный опрос) обычно вы подключаетесь к веб-серверу, где вы просто ждете, когда произойдет событие, и чаще всего нет.Это способствует более одновременным соединениям.Также можно сказать, что многие из этих пользователей ожидают одних и тех же событий, происходящих по всем направлениям.

Выделение потока, тогда для пользователя, в первую очередь, просто вращение и ожидание, не очень оптимальная модель для такого типа вещей.Лучшей моделью является веб-сервер, основанный на цикле событий, который выполняет все асинхронным образом, и когда отправка события нескольким пользователям не требует дорогостоящего переключения контекста для каждого клиента.Это то, на чем построен Node.js (с использованием libevent в качестве его ядра), а также Ruby Eventmachine, Twisted Python, Tornado от Friendfeed, Jetty и сервер Manos на основе C #.

Именно поэтому часто бывает выгоднее, чтобы комета выполняла на своем собственном процессе пользовательский сервер, поскольку традиционные веб-серверы, такие как Apache и более старые версии IIS, не функционируют в зависимости от потребностей Comet.

Стандартные приложения ASP.NET немного испорчены, потому что пул потоков в .NET ограничен 25 общими потоками и 25 потоками ввода-вывода (а соединения http принимают поток ввода-вывода).Вы можете быть фактически ограничены, чтобы быть немного меньше, чем в реальности, потому что пул потоков используется совместно со всеми другими вещами в .NET.Однако вы можете увеличить пул потоков с помощью параметра конфигурации, но производительность имеет тенденцию экспоненциально снижаться при увеличении количества потоков, которые вы добавляете. Теоретически вы можете увеличить это число, если можете гарантировать, что вы не будете сильно расти, изатем, возможно, просто используйте стандартные потоковые мониторы в .NET для создания своей собственной системы диспетчеризации событий кометы.

Однако приложения .NET, работающие с более новыми версиями IIS, все же имеют луч надежды.Вы можете создать пользовательский IAsyncHttpHandler .В Интернете есть несколько отличных руководств, которые вы можете прочитать о том, как это работает.Благодаря этому вы можете создать свой собственный пул соединений и более эффективно обслуживать своих клиентов.Это не идеальное решение, и вам придется самостоятельно строить много сантехники. WebSync - это коммерческий продукт, который обертывает этот интерфейс для вас и дает вам некоторые компоненты инфраструктуры высокого уровня, с которыми вы можете работать.

1 голос
/ 25 октября 2010

WebSync будет хорошим решением для вас;он работает на IIS, поэтому никаких внешних процессов не требуется.Проверьте это здесь .

0 голосов
/ 25 октября 2010

Вы смотрели на PubNub ? Это может быть в состоянии справиться с тем, что вы делаете. Это стоит денег, но вы также получаете кучу бесплатных транзакций. Не уверен, какую нагрузку вы ожидаете.

0 голосов
/ 21 октября 2010

Вы можете реализовать это самостоятельно, используя длинный пул. 25 одновременных запросов не должны быть проблемой для IIS. Просто посмотрите, какие потоки APE передают клиентам - довольно просто, как переопределить это в 100 строках кода (я имею в виду сериализацию в совместимом формате).

...