Сегодня выступал на [HighLoad++](http://highload.ru/) с докладом [Twisted Framework - фреймворк для написания сетевых приложений в Python](http://www.highload.ru/papers2009/12261.html). ## Введение Последнее время в области web происходит смещение внимания с тяжелых application-серверов, которые тратят на обработку запроса сотни миллисекунд, а то и секунды, к более легковесным сервисам, передающим меньшие объемы данных с минимальной задержкой. Переход от генерации десятков и сотен килобайт HTML-кода в ответ на запрос к передаче изменений в данных, запакованных в JSON и измеряемых сотнями байт. В качестве примеров таких сервисов можно привести Gmail, FriendFeed, Twitter Live Search и т.п. Для обеспечения минимальной задержки для пользователя необходимо либо поддерживать постоянное соединение (например, Adobe Flash, RTMP) или использовать технику HTTP long polling в сочетании с keep alive. Так или иначе на стороне сервера это приводит к появлению большого количества одновременных соединений (тысячи, десятки тысяч), по каждому из которых передается не такой большой объем данных. Эту ситуацию называют обычно проблемой [C10k](http://www.kegel.com/c10k.html). Для обработки соединений архитектурный выбор на стороне сервера не такой большой: процесс на соединение, нить на соединение, комбинированный вариант процесс-нити или асинхронный ввод-вывод (возможно, в сочетании с дополнительными процессами или нитями). При наличии более 10 тысяч одновременных соединений с точки зрения расхода ресурсов совершенно невозможно представить создание 10 тысяч процессов; 10 тысяч нитей также вряд ли будет разумным решением. Необходимо дополнительно учесть, что при наличии такого большого числа соединений объем работы по каждому из них относительно невелик, большинство их них простаивают в ожидании поступления новых данных. Поэтому бóльшая часть процессов или нитей будет просто находиться в состоянии ожидания, расходуя впустую системные ресурсы. Асинхронный ввод-вывод позволяет осуществлять неблокирующийся сетевой ввод-вывод по тысячам открытых сокетов в рамках одной нити выполнения (одного процесса). Механизмы реализации в разных ОС разные, например: select(), poll(), epoll(), kqueue() и т.п. Примеры приложений, использующих асинхронный ввод-вывод: * nginx (используются дополнительные процессы для обслуживания задач, требующих большего объема CPU); * haproxy; * memcached; * и другие. Тем не менее, асинхронный ввод-вывод не является универсальным решением: для сервера БД это вряд ли было бы хорошим способом организации обслуживания соединений, так как для обработки каждого запроса требуется большой объем дискового ввода-вывода и процессорного времени, что не позволяет это сделать в рамках одного процесса. [Twisted Framework](http://www.twistedmatrix.com/) — это обширный набор классов и модулей для реализации асинхронных сетевых приложений. Twisted Framework — это: * ядро, абстрагирующее все операции асинхронного ввода-вывода и использующее соответствующий механизм конкретной ОС; * концепция Deferred, которая позволяет реализовать в простой форме обслуживание запроса: асинхронные сетевые обращения (например, к БД, memcached), обработку ошибочных ситуаций; Deferred является аналогом обычных конструкций последовательного программирования для асинхронной модели программирования; * обширный набор уже реализованных сетевых протоколов: HTTP, DNS, SMTP, IMAP, memcached, Jabber, ICQ и т.д.; еще большее количество протоколов доступно в виде дополнительных модулей; * дополнительная инфраструктура: unit-testы с поддержкой Deferred, пулы нитей, процессов и т.д.; * качественная концепция разработки — полное покрытие unit-testами, строгий review любого изменения. Основная часть доклада будет посвящена конкретным примерам приложений, реализованными с помощью Twisted — с архитектурой, конкретными параметрами производительности, приемами оптимизации, преимуществами и недостатками Twisted для решения данной задачи: * [RTMP-сервер pyFMS](http://www.smira.ru/2008/04/09/rit-2008/), сервер вещаний сервиса Smotri.Com (сотни трансляций, десятки тысяч зрителей); * backend-сервер [проекта MDC](http://www.mdc.ru/) - хранение и обработка истории общения пользователей, хранение настроек и т.п.; * [Qik Push Engine](http://www.smira.ru/2009/07/12/qik-push-engine-api-private-beta/) - сервер немедленной доставки изменений информации о видео, созданных пользователями сервиса, в том числе push-нотификация о появившихся live-стримах, масштабирование, обработка больших объемов информации. Дополнительная информация: * [Документация Twisted](http://twistedmatrix.com/projects/core/documentation/howto/) * [О Python](http://www.smira.ru/category/development/python-development/), а также о [Twisted](http://www.smira.ru/category/development/twisted-development/) * [Блог на Хабрахабре про Twisted](http://habrahabr.ru/blogs/twisted/) * [Александр Бурцев о Twisted](http://burus.org/2008/12/16/twisted-classic-examples/) * [Deferred в Twisted](http://www.smira.ru/2009/02/10/deferred-async-programming/) и [не только](http://www.smira.ru/2009/02/24/more-about-deferred/) . ## Презентация

Twisted Framework - сетевые приложения в Python
View more documents from Smirnov.Andrey.
* Скачать презентацию (PDF)