Реализация серверной загрузки с помощью Twisted framework

Я разрабатываю групповой чат, используя фреймворк python Twisted. Техника, которую я использую, - это длинный опрос с помощью Ajax. Я возвращаю SERVER_NOT_DONE_YET, чтобы соединение оставалось открытым. Код не блокирует и разрешает другие запросы. Насколько это масштабируемо ??

Однако я хочу опередить эту потоковую передачу по открытым соединениям. Я хочу реализовать чистый серверный толчок. Как это сделать ? Нужно ли мне идти в сторону XMPP? Если я открою сокет на сервере для каждого уникального клиента, какой веб-сервер лучше всего подойдет для моста? Насколько это будет масштабируемо?

Я хочу, чтобы он был таким же масштабируемым, как проблема C10K. Я хотел бы придерживаться Twisted, потому что он имеет множество реализаций протокола в простых шагах. Пожалуйста, укажите мне правильное направление. спасибо


person Arthas    schedule 24.06.2013    source источник
comment
Когда вы спрашиваете, насколько это масштабируемо, какую форму вы ожидаете получить ответ?   -  person Glyph    schedule 11.02.2014


Ответы (2)


Длительный опрос работает, но не обязательно является лучшим вариантом. Это становится действительно неприятным с точки зрения интеграции с брандмауэрами и ненадежным интернет-соединением. Например, на работе многие брандмауэры наших клиентов отключают любое HTTP-соединение, которое не активно в течение 10-20 секунд.

Мы решили множество проблем, перейдя на WebSocket через SSL. WebSocket дает вам полнодуплексный канал, который идеально подходит для проталкивания на сервер. Используя SSL, брандмауэры часто менее агрессивны в сборе мусора и прозрачные прокси часто обманываются шифрованием TLS. Вам все равно придется управлять случайным отключением на уровне приложения, даже если вы используете WebSockets вместо длительного опроса, но даже это можно изящно обработать, имея достойный протокол восстановления, независимо от того, какой транспортный протокол вы используете.

При этом вместо непосредственного использования WebSockets мы решили использовать SockJS. Основная причина такого выбора заключалась в том, что SockJS может использовать WebSockets, когда они доступны (rfc6455, hixie-76, hybi-10), но также может использовать xhr-streaming, xdr-streaming, etc, если браузер клиента не поддерживает это (или при сбое подключения). Когда я говорю, что он может «откатиться», я имею в виду, что код, который вы используете на стороне клиента, остается точно таким же, SockJS берет на себя всю грязную работу.

На стороне сервера то же самое. В настоящее время мы используем Cyclone реализация SockJS для Twisted (в производстве), но нам также известно о DesertBus', которую нам еще предстоит проверить. Есть также некоторые другие вещи, которые мы надеемся проверить, например, WAMP и сопутствующий Autobahn|Python.

Что касается производительности, мы используем HAProxy для терминации SSL и балансировки нагрузки. HAProxy поразительно эффективен на многих уровнях.

person teotwaki    schedule 08.02.2014

Сейчас мы перешли на WebSockets. Работает отлично!!

person Arthas    schedule 20.08.2015