Twisted ПАиПП — Практика в рабочих проектах
Постановка задачи
В качестве примера буду использовать два реализованных проекта:
- FATS — Быстрые телефонные сервисы на базе программной IP-PBX Asterisk
- DBSync — синхронизатор баз данных в режиме 24/7/365
В первую очередь важно понять необходимость использования Twisted. Как уже говорилось ранее: “есть множество способов решить задачу”.
FATS:
Прецеденты:
- Необходимо запускать множество средних\сложных сервисов на базе Asterisk
- Сервисы работают со сторонними технологиями: Базы Данных, XML-RPC, Web
- Удобство администрирования и обновления версий
Способы решения:
Стандартными средствами Asterisk, применяя макросы и запуск внешних команд на сервере(fork).
Очевидно, что способ имеет ряд недостатков для большого объема кода(сценария макроса) и более менее сложной логики.
плюсы:
- Может писать администратор Asterisk, все в одних руках. Быстрый хак.
минусы:
- Сложная логика, запутанный код - хак.
- Не удобно вести отладку. Перезапускать план дозвона возможно не понадобится, но проверять приложение придется вручную.
- Порожденные процессы будут нагружать CPU сервера Asterisk — тратить общие ресурсы. Запускаются на каждую сессию звонка с копированием контекста процесса.
На динамическом языке программирования, запускать на исполнение(fork) используя протокол AGI
плюсы:
- Может писать администратор Asterisk, программист. Быстрый хак.
- Можно использовать удобный язык программирования. Python очень хорошо подходит для таких задач.
- Все в одном приложении, ясная картина.
минусы:
- Запускается как процесс на сервере Астериск для каждой сессии звонка, расходует ресурсы CPU сервера.
- Не удобно вести отладку. Перезапускать dialplan возможно не понадобится, но проверять приложение придется вручную.
Исполнять приложение удаленно используя FastAGI протокол (TCP\IP).
плюсы:
- Можем исполнять приложение или много приложений на удаленном сервере. Оставляем ресурсы сервера для Asterisk.
- Позволяет использовать динамические языки программирования.
- Все в одном приложении, ясная картина.
минусы:
- Необходимо повышать квалификацию администратора до программистов или нанимать программиста.
Twisted в студию
плюсы:
- Минимальная нагрузка. Можем обрабатывать множество запросов в рамках одного процесса без блокировок. Приложение может работать на сервере вместе с Asterisk.
- Масштабирование. Множество готовых протоколов для модернизации приложения, необходимо писать только нужный код. Никаких изобретений велосипедов!
- Универсальность, красота. Python — понятный язык. Применяется как программистами, так и администраторами серверов.
- Тестирование. Правильная реализация позволит тестировать работу кода в процессе разработки без использования рабочего сервера с программными телефонами(soft phone) в 98% задач.
минусы:
- Нужно повышать квалификацию кадров или нанять специалиста. Эту проблему можно решить путем разового найма для решения возникшей задачи.
DBSync
Прецеденты:
- Необходимо синхронизировать данные разных хранилищ с заданным интервалом времени
- Хранилищем данных могут быть PostgreSQL, MySQL, MSSQL, Oracle, XML и т.д.
- Данные могут передаваться по сети, путем чтения из файла, через web и т.д. Данные могут быть шифрованные: ssl, ssh и т.д.
- Отношение сущностей в хранилищах разное
- Структура данных может и будет меняться, множество разных конкурентных связей данных в рамках одной сессии синхронизации.
- Сервис должен работать в режиме 24/7/365.
- Нужно очень быстро адаптироваться к изменениям. Минимальные затраты на масштабирование и\или модернизацию.
Примечание:
Изначально ставилась “узкая” задача, поэтому проект работает в ее рамках. Синхронизация работает по сети, между различными БД. Кроме того на базе API решаются маленькие задачи с синхронизацией WEB - БД.
Способы решения:
Скрипт на любом удобном языке, запускать в cron сервера
плюсы:
- Быстрая разработка для выполнения конкретной задачи
минусы:
- Проблемная отладка. Можно написать тесты и решить эту проблему.
- Не гибкое решение. С учетом изменений данных и типов хранилищ придется менять скрипт, копаться в куче кода.
- С учетом нескольких подобных задач код будет либо дублироваться и создавать путаницу, либо превратится в библиотеку(некое API).
- Скорее всего разработчик будет писать логику БД в коде приложения. В противном случае мы начинаем делать из первого способа второй и теряем плюс в быстрой разработке.
- Распараллеливание задач в рамках сессии синхронизации. Очень похоже на изобретение велосипеда, странно выглядит, если написано с нуля. Противоречим нашему плюсу.
Скрипты на API с использованием ООП. Использовать ядро системы для создания отдельных сервисов
плюсы:
- Гибкое решение. Грамотное API позволит легко масштабировать сервисы.
- Перспектива быстрой и простой разработки подобных сервисов. Использую мозги, а не попу.
минусы:
- Может превратиться в состояние вечной разработки. Нужен грамотный подход.
- Время. Перспектива остается перспективой, возможно она и не понадобится.
3. Нанять кучу операторов, чтобы вносить данные вручную. Можно выписать “диких обизяян” у тети из Бразилии.
- Читаем в других блогах, смотрим советское кино. %)
Twisted в студию:
плюсы:
- Масштабирование. Наличие готовых компонентов для работы со множеством БД, протоколов и т.д.
- Красота. Python — понятный язык. С учетом обработки массивов данных — это плюс(использование ORM усложнит задачу и уменьшит производительность).
- Тестирование. Правильная реализация позволит тестировать работу кода в процессе разработки без использования реальных хранилищ.
- Адаптация данных. Мы будем использовать zope.interface и адаптеры для наглядного модифицирования данных из одной сущности в другую.
- Универсальность. В перспективе мы действительно сможем быстро делать сервисы синхронизации и быть уверенными в из работоспособности.
минусы:
- Сроки реализации увеличатся.
- Окончание проекта требует грамотного проектирования и реализации.
Проектирование \ Шаблоны проектирования
Twisted содержит очень много примеров грамотного кода, если следить за разработкой платформы, то можно видеть как происходит изменение системы и почему одним элементам уделяют много внимания, а другим нет. Как разработчики следят за стабильностью кода.
В Twisted активно используются шаблоны проектирования:
- Фабрика методаFactory method. Фабрики порождают протоколы для каждой сессии соединения.
- ФасадFacade. Скрывает реализацию и позволяет использовать интерфейсы для оптимизации и простоты доступа в подсистему Twisted.
- ПодписчикObserver. Система логирования может подключать подписчиков для модернизации сбора информации и ее сохранения в разных хранилищах.
- РеакторReactor. Ядро twisted для работы с событиями и управления отложенными задачами.
- АдаптерAdapter. Позаимствовано у zope.interface. Позволяет регистрировать адаптеры и типизировать сложные данные, объекты за счет интерфейсов.
- СтратегияStrategy. Позволяет выбрать стратегию алгоритма с учетом входных данных или требуемых выходных данных.
и так далее.
Нам важно использовать шаблоны на практике, чтобы не плодить лишний и не понятный код.
Для более детального изучения шаблонов могу посоветовать книгу “Применение UML и шаблонов проектирования”, автор Крэг Ларман.



















