Джанго / Комета (толчок): Наименее всех зол? - PullRequest
53 голосов
/ 30 ноября 2010

Я прочитал все вопросы и ответы, которые я могу найти относительно Django и HTTP Push. Тем не менее, ни один из них не предлагает четкого, краткого, комплексного решения о том, как выполнить базовый «привет мир» так называемой «кометной» функциональности.

Первый вопрос (1): В какой степени проблема в том, что HTTP просто (по крайней мере, пока) не создана для этого? Все потенциальные решения по сути взломаны?

2) Какое лучшее на данный момент решение доступно?

  • облетел
  • Какое-нибудь другое решение на основе Twisted?
  • Торнадо?
  • Node.js?
  • XMPP с BOSH?

Другое решение?

3) Как модуль push nginx играет в этом обсуждении?

4) Какое из этих решений требует замены типичной модели развертывания mod_wsgi / nginx (или apache)? Зачем им это нужно? Это благоприятный переход в любом случае?

5) Насколько значительны преимущества использования решения, уже имеющегося в Python?

Презентация Алекса Гейнора из PyCon 2010, которую я только что посмотрел на blip.tv, удивительна и информативна, но не очень специфична для текущего состояния HTTP Push в Django. Одна вещь, которую он сказал, которая вселяла в меня некоторую уверенность, заключалась в следующем: Orbited делает хорошую работу по абстрагированию и моделированию концепции сетевых сокетов. Таким образом, когда WebSockets действительно приземлится, мы будем в хорошем месте для перехода.

6) Чем веб-сокеты HTML5 отличаются от существующих решений? Точна ли оценка Гейнором легкости перехода с Орбиты?

Ответы [ 4 ]

24 голосов
/ 10 декабря 2010

Я бы взглянул на evserver (http://code.google.com/p/evserver/), если все, что вам нужно, это комета.

. Он "поддерживает малоизвестное асинхронное расширение WSGI" и построен вокруг libevent. Работает как шарм.и поддерживает django. Фактический код обработчика немного уродлив, но он хорошо масштабируется, поскольку он действительно асинхронный.

Я использовал evserver, и в настоящее время я перехожу на циклон (торнадо на витой), потому что мне нужнонемного больше, чем у evserver. Мне нужен настоящий двунаправленный интерфейс io (думаю, socket.io (http://socket.io/)), и хотя evserver мог его поддерживать, я подумал, что проще переопределить socket.io торнадо в циклоне (я выбралЦиклон вместо торнадо, так как циклон построен на витой, что позволяет использовать больше транспортов, которые не реализованы в витой (ic zeromq)) Socket.io поддерживает веб-сокеты, опросы в стиле комет и, что гораздо важнее, пересекающиеся веб-сокеты на основе Flash.что в большинстве практических ситуаций веб-сокетов + флэш-сокетов на основе флэш-памяти достаточно для поддержки 99% (по данным Adobe Flash PenЭто составляет около 99% (http://www.adobe.com/products/player_census/flashplayer/version_penetration.html)) посетителей веб-сайтов (только люди, не использующие Flash, могут использовать один из сокетов socket.io - его резервные транспорты (с меньшими затратами ресурсов и ресурсов))

Знайте, хотя websockets не являются http-транспортом , поэтому размещение их за прокси-серверами, основанными на http (например, haproxy в режиме http), разрывает соединение.Лучше обслуживать их по альтернативному ip или порту, чтобы вы могли использовать прокси в режиме tcp (например, haproxy в режиме tcp).

Чтобы ответить на ваши вопросы: (1) Если вам не нужны решения на основе двунаправленного транспорта с длинным опросомдостаточно хороши (все, что они делают, это поддерживают соединение открытым).Вещи становятся неуместными, когда вам нужно, чтобы ваше соединение было полным, или вы должны иметь возможность и отправлять, и получать данные.В последнем случае socket.io помогает.Тем не менее, для этого сценария созданы веб-сокеты, и с поддержкой flash он доступен для большинства посетителей веб-сайтов (через socket.io или автономно, однако socket.io имеет дополнительное преимущество в виде транспорта для резервного копирования для тех, кто не хочет устанавливать flash)

(2) если все, что вам нужно, это нажать, evserver - ваш лучший выбор.Он использует те же самые javascripts на стороне клиента, что и на орбите.Еще посмотрите на socket.io (для этого также необходим поддерживающий сервер, единственный доступный питон - это tornado.)

(3) Это просто еще одна реализация сервера.Если я правильно прочитал, это только толчок.отправка данных клиенту осуществляется путем установки http equest из вашего приложения на сервер nginx.(Затем nginx позаботится о том, чтобы они достигли клиента).Если вы заинтересованы в этом, посмотрите на mongrel2 (http://mongrel2.org/home) имеет не только обработчики для длинного опроса, но и для веб-сокетов. (Вместо того, чтобы делать http-запрос к mongrel, на этот раз вы используете обработчики zeromq для передачи данных на ваш сервер mongrel)(Обратите внимание на то, что разработчик не проявляет энтузиазма по поводу веб-сокетов и веб-сокетов на основе флеш-памяти. Особенно принимая во внимание, что протокол веб-сокетов имеет тенденцию развиваться, в какой-то момент вам может понадобиться перекодировать поддержку веб-сокетов mongrel2 самостоятельно, продолжая поддерживать веб-сокеты)

(4) Все решения, кроме evserver, заменяют wsgi чем-то другим. Хотя большинство серверов также поддерживают некоторые wsgi поверх этого «чего-то другого». Независимо от того, какое решение вы выберете, будьте осторожны, если один процессор интенсивно или иначе блокирует запрос.не блокирует сервер (вам нужно несколько экземпляров или потоков).

(5) Не очень важно.Все решения зависят от некоторых пользовательских обработчиков, которые передают (и, если применимо, получают) данные клиенту.Все упомянутые решения позволяют писать эти обработчики на python.Если вы хотите использовать совершенно другой фреймворк (node.js), вам нужно взвесить легкость node.js (он предполагается легким, но также довольно экспериментальным, и я обнаружил, что очень немногие библиотеки действительно стабильны)удобство использования существующей кодовой базы и доступных библиотек (например, если вашему приложению нужен блог, существует множество блогов django, которые вы можете подключить, но нет ни одного для node.js). Также не закрывайте глаза на статистику производительности.если вы не планируете передавать тупые предопределенные данные (что делают все тесты) клиенту, вы обнаружите, что фактическая обработка данных добавляет намного дополнительных издержек, чем даже худшая асинхронная реализация.(Но вы по-прежнему хотите использовать сервер на основе асинхронного ввода-вывода, если вы планируете иметь много одновременных клиентов, многопоточность просто не предназначена для поддержки тысяч соединений)/ комета только выталкивает данные, но не принимает записи.(Socket.io имитирует эту двунаправленную поддержку, используя два http-запроса, один для longpoll, один для отправки данных. Он отслеживает их взаимозависимость по идентификатору (сеанса), который является частью строки запроса обоих запросов).Веб-сокеты на основе флэш-памяти аналогичны реальным веб-сокетам (разница в том, что их реализация в SWF, а не в браузере).Также протокол websockets не соответствует протоколу http;Лонгполлинг / кометы делают (технически клиент websocket отправляет запрос на обновление на сервер websocket, обновленный протокол больше не http)

7 голосов
/ 06 декабря 2010

Существует поддержка WebSockets с django-websocket , но, к сожалению, существуют серьезные проблемы с его работой; Вот цитата с этой страницы:

Отказ от ответственности (что следует знать при использовании django-websocket)

БОЛЬШОЙ ОТКАЗ ОТ ЖИРА - в настоящий момент технически НЕ возможно каким-либо образом использовать веб-сокет с WSGI. Это известная проблема, но она не может быть решена в чистом виде из-за некоторых дизайнерских решений, которые были приняты во время написания стандарта WSGI. В то время таких вещей, как Websockets и т. Д. Не было и они не были предсказуемы.

...

Но не только WSGI является ограничивающим фактором. Сам Django был разработан вокруг простого сценария запроса на ответ без учета Websockets. Это также означает, что предоставление стандартной реализации websocket для django сейчас невозможно. Однако это работает как-то не очень красиво. Так что имейте в виду, что при использовании django-websocket сокеты tcp могут подвергнуться пыткам.

Итак, на данный момент, WSGI: не уходи; Django: почти нет, даже с django-websockets; см. также комментарий в оригинальном объявлении автора :

Не могу сказать, что это выглядит как хорошая идея. Вы делаете долгоживущие соединения таким способом, который потребует многопоточности. django-websocket требует настройки потоков и не будет работать, если у вас есть процессы (потому что у вас было бы слишком много процессов), но потоки не будут масштабироваться одновременно для большого количества соединений, так что это просто ложная безопасность. Вам нужна асинхронная платформа для долгоживущих вещей, и я делаю это, делая свое приложение в Django и мою комету и websocket в Node.js

Лично, если я пытаюсь использовать WebSockets (который я ожидаю в следующем году), я сначала попробую комбинацию Twisted и Cyclone . Они предназначены для работы с WebSockets и хорошо масштабируются. Если вы пишете свой код правильно, чтобы удалить ненужные зависимости от Django, вы сможете использовать большую часть своего кода в системе на основе Twisted. Это очень явное преимущество перед использованием Node.js или Comet или любой системы на другом языке. Вы также можете сделать простой толчок

Наконец, вы также можете просто решить, что это слишком сложно, и использовать внешнюю службу для предоставления push-поддержки. Тогда это становится вопросом отправки простого запроса JSON на их серверы, вместо того, чтобы беспокоиться о том, как установить соединение, как будет работать параллелизм и тому подобное. Конечно, вам придется заплатить за это (хотя в настоящее время он может быть бесплатным, пока в бета-версии), но вам не нужно беспокоиться о деталях реализации; тем не менее, вы не сможете использовать всю мощь WebSockets - просто нажмите поддержку.

1 голос
/ 05 января 2017

Не могу поверить, что прошло более шести лет с тех пор, как я задал этот вопрос.

Асинхронизация с Django (и связанным сетевым трафиком, например, веб-сокетами) была зудом для многих из нас в сообществе.Я взял эти последние несколько лет, чтобы, среди прочего, поцарапать этот зуд.

hendrix

hendrix - это соединение WSGI / ASGI, котороеработает на витой.Это был проект, в основном управляемый 5 энтузиастами, с помощью и финансированием некоторых дальновидных организаций.В настоящее время он работает в десятках, но не в сотнях компаний.

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

  • он основан на Twisted, не требует знаний или использования Twisted внутренностей, но оставляет их всех доступными
  • Он «просто работает» в том смысле, что вам не нужен какой-либо специальный серверили процесс конфигурации для выполнения асинхронного и сокетного трафика из вашего приложения Django (или Pyramid, или Flask)
  • Очень вероятно, что он будет напрямую совместим с ASGI, стандартом Django Channels, и в некоторых значимых отношенияхпервый контейнер ASGI
  • Поставляется с простыми API, которые поддерживают логику вашего представления и просты в модульном тестировании.

Пожалуйста, посмотрите этот доклад , которыйЯ дал в Django-NYC (в офисах Buzzfeed) дополнительную информацию о том, почему я считаю, что это лучший ответ на этот вопрос.

1 голос
/ 01 декабря 2010

По вопросу № 2, недавно мне рассказали о внутренностях приложения Django, которое интенсивно использует Comet, и Orbited было решением, которое они выбрали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...