Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Twisted

Глава 21 из книги "Архитектура приложений с открытым исходным кодом", том 2.

Оригинал: Twisted
Автор: Jessica McKellar
Перевод: А. Панин

Приложения

Twisted является фреймворком для создания масштабируемых, кроссплатформенных сетевых серверов и клиентов. Упрощение процесса развертывания этих приложений в соответствии со стандартом в промышленных окружениях является важным шагом для подобной платформы, направленным на расширение ее распространения.

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

Инфраструктура приложения состоит из четырех основных частей: Служб (Services), Приложений (Applications), системы управления конфигурацией (с помощью TAC-файлов и плагинов) и утилиты командной строки twistd. Для иллюстрации этой инфраструктуры мы превратим эхо-сервер из предыдущего раздела в приложение.

Служба

Под службой понимается все то, что может быть запущено и остановлено, а также создается с использованием интерфейса IService. В комплекте поставки Twisted присутствуют реализации служб для TCP, FTP, HTTP, SSH, DNS и многих других протоколов. Множество служб может регистрироваться одним приложением.

Основой интерфейса IService служат следующие методы:
startService Запуск службы. Этот процесс может включать стадии загрузки данных конфигурации, установления соединений с базой данных или начала ожидания соединений на порту.
stopService Остановка службы. Этот процесс может включать стадии сохранения данных на диск, закрытия соединений с базой данных или окончания приема соединений на порту.

Наша эхо-служба использует протокол TCP, поэтому мы можем использовать стандартную реализацию интерфейса IService с названием TCPServer.

Приложение

Приложение является высокоуровневой службой, представляющей всю программу, созданную с использованием Twisted. Службы регистрируют себя в рамках приложений и описанная выше утилита развертывания twistd ищет и запускает приложения.

Мы создадим эхо-приложение, в рамках которого может быть зарегистрирована эхо-служба.

Файлы TAC

При работе с приложениями Twisted, реализованными с использованием обычных файлов исходного кода языка Python, разработчик несет ответственность за разработку кода для запуска и остановки цикла обработки событий, а также настройки приложения. В рамках инфраструктуры приложений Twisted реализации протоколов располагаются в модулях, использующие данные протоколы службы регистрируются с помощью файла конфигурации приложения Twisted (Twisted Application Configuration (TAC)), а цикл обработки событий и процесс конфигурации управляются внешней утилитой.

Для того, чтобы превратить наш эхо-сервер в эхо-приложение, мы можем использовать следующий простой алгоритм:
  1. Перенести части кода эхо-сервера, относящиеся к реализации протокола, в отдельный, предназначенный для них модуль.
  2. В TAC-файле:
    1. Создать эхо-приложение.
    2. Создать экземпляр службы TCPServer, который будет использовать наш класс EchoFactory и зарегистрировать его в рамках приложения.

Код для управления циклом приема событий с использованием утилиты twistd будет обсуждаться ниже. В итоге код приложения будет аналогичен следующему:

Файл echo.py:
from twisted.internet import protocol, reactor

class Echo(protocol.Protocol):
    def dataReceived(self, data):
        self.transport.write(data)

class EchoFactory(protocol.Factory):
    def buildProtocol(self, addr):
    return Echo()
Файл echo_server.tac:
from twisted.application import internet, service
from echo import EchoFactory

application = service.Application("echo")
echoService = internet.TCPServer(8000, EchoFactory())
echoService.setServiceParent(application)

twistd

twistd (произносится "твист-ди") является кроссплатформенной утилитой для развертывания приложений, созданных с использованием Twisted. Она исполняет TAC-файлы и обрабатывает запуск и остановку приложения. Согласно подходу "batteries-included", используемому в ходе разработки сетевого фреймворка Twisted, утилита twistd поддерживает множество полезных параметров конфигурации, в том числе запуск приложения в режиме демона, указание расположения файлов журнала, снижение системных привилегий, запуск приложения в окружении chroot, запуск приложения с нестандартным циклом обработки событий или даже запуск приложения под управлением программы для профилирования.

Мы можем запустить наше эхо-приложение с помощью команды:
twistd -y echo_server.tac
В простейшем случае twistd запустит экземпляр приложения в режиме демона, причем запись сообщений о событиях будет осуществляться в файл с именем twistd.log. После запуска и остановки приложения файл журнала событий будет содержать подобные строки:
2011-11-19 22:23:07-0500 [-] Log opened.
2011-11-19 22:23:07-0500 [-] twistd 11.0.0 (/usr/bin/python 2.7.1) starting up.
2011-11-19 22:23:07-0500 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2011-11-19 22:23:07-0500 [-] echo.EchoFactory starting on 8000
2011-11-19 22:23:07-0500 [-] Starting factory <echo.EchoFactory instance at 0x12d8670>
2011-11-19 22:23:20-0500 [-] Received SIGTERM, shutting down.
2011-11-19 22:23:20-0500 [-] (TCP Port 8000 Closed)
2011-11-19 22:23:20-0500 [-] Stopping factory <echo.EchoFactory instance at 0x12d8670>
2011-11-19 22:23:20-0500 [-] Main loop terminated.
2011-11-19 22:23:20-0500 [-] Server Shut Down.

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


Продолжение статьи: Плагины