Русская Википедия:Open Telecom Platform

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Карточка программы Open Telecom Platform, OTP, Erlang/OTP («открытая телекоммуникационная платформа») — программный каркас (фреймворк), содержащий набор библиотек и шаблонов проектирования для построения масштабируемых распределённых приложений на языке программирования ErlangШаблон:Sfn.

Фреймворк создан в компании Ericsson в рамках проекта ATM-маршрутизаторов серии AXD в одноимённом производственном подразделенииШаблон:Sfn и выпущен в 1996 годуШаблон:Sfn, воплотив многолетний опыт по созданию отказоустойчивых системШаблон:Sfn.

Высокая надёжность приложений возможна благодаря простому, но мощному механизму обработки исключений, на основе которых были построены обобщённые библиотеки. Используя библиотеки фреймворка OTP, разработчик на Erlang программирует требуемое поведение, а библиотеки занимаются обработкой исключений. Такой подход делает код короче и обычно вносит меньше ошибокШаблон:Sfn.

В своей диссертации Джо Армстронг объясняет выбранный в OTP подход к программированию высоконадёжных систем необходимостью абстрагирования от параллельного исполнения (Шаблон:Lang-en): отлаженный и проверенный в работе OTP берёт заботу о параллельном исполнении на себя, тогда как менее квалифицированные прикладные программисты могут создавать остальные компоненты в более простом и знакомом им «последовательном» стиле[1].

Основные понятия

Формализацией шаблонов проектирования, характерных для конкурентного программирования, являются поведения (Шаблон:Lang-en), реализованные в виде модулей стандартной библиотеки Erlang. В модулях определяется обобщённая функциональность для процессов некоторого типа. Программисту требуется лишь создать свой модуль с функциями обратного вызова (Шаблон:Lang-en), конкретизирующий функциональность.

Файл:Erlang-otp.png
Дерево процессов

Поведение OTP строится из рабочих процессов (Шаблон:Lang-en) и процессов-наблюдателей (Шаблон:Lang-en), составляющих дерево наблюдения (Шаблон:Lang-en).

Модули и деревья наблюдения вместе образуют OTP-приложение (не следует путать с приложением в смысле готового программного продукта). OTP-приложение — компонент, реализующий некоторую функциональность, которая может быть независимо запущена на исполнение и остановлена как целое, а также повторно использована в других системах[2]. Примером приложения, входящего в состав Erlang/OTP, может служить Mnesia.

Составные части поведения

Взаимодействия модуля поведения и модуля функций обратного вызова происходит по схемеШаблон:Sfn:

Модуль поведения ↔ Процесс ↔ Модуль функций обратного вызова

Модуль поведения содержит общую для процессов некоторого типа функциональность, включающую в себя характерные операцииШаблон:Sfn:

  • Запуск и регистрация процесса.
  • Отправка и приём сообщений, отдельно для синхронного и асинхронного режима, с определением протокола сообщений.
  • Сохранение и обновление состояния цикла (Шаблон:Lang-en) процесса, управление циклом процесса.
  • Завершение процесса.

Специфичная функциональность описывается программистом в модуле функций обратного вызова и включает следующееШаблон:Sfn:

  • Инициализация состояния цикла процесса, при необходимости регистрации процесса — имя процесса.
  • Функции обработки запросов клиента.
  • Функция обработки и обновления состояния цикла.
  • Очистка данных по завершении процесса.

Таким образом, в поведении можно выделить следующие частиШаблон:Sfn:

  • Интерфейс поведения — набор функций и связанных с ними соглашений об их вызове.
  • Реализация поведения — код модуля функций обратного вызова.
  • Контейнер поведения[3] — процесс (или группа процессов), выполняющий код библиотечного модуля и использующий функции обратного вызова для конкретной функциональности.

Некоторое поведение является как бы образцом для конкретного «типа» процессов (например, процессы типа gen_fsm). Говоря неформально, процессы одного «типа» выполняют примерно одинаковый код, а значит — «понимают» определённый набор сообщений. Процессы одного «типа» отличаются только своим индивидуальным состоянием. Между процессами и объектами ООП можно проследить достаточно чёткую аналогию, с той возможной разницей, что процессы выполняются независимо и конкурентноШаблон:Sfn.

Основные поведения и OTP-приложения

Обобщённый сервер (gen_server)

Обобщённый сервер реализует модель клиент-сервер. Начало модуля функций обратного вызова для этого поведения может в минимальном случае выглядеть примерно таким образомШаблон:Sfn:

-module(myserver).
-behaviour(gen_server).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
% далее следует описание функций, относящихся к интерфейсу поведения

Кроме функций обратного вызова модуль может содержать функции API. В случае gen_server такими функциями могут быть запуск процесса, а также отправка синхронных и асинхронных сообщений этому процессу. Функции API обычно являются обёртками для вызова соответствующих функций библиотеки. Продолжая предыдущий примерШаблон:Sfn:

-export([start_link/1, get_something/0, stop/0]).
start_link(Port) -> gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).
% далее следуют другие функции, объявленные в директиве экспорта

Документация по Erlang/OTP даёт описание функций модуля поведения и связанных с ними функций обратного вызова в виде таблицы[4].

Модуль обобщённого сервера gen_server: Модуль функций обратного вызова
start_link init/1
call, multi_call handle_call/3
cast, abcast handle_cast/2
- handle_info/2
- terminate/2
- code_change/3

Обработчик событий (gen_event)

Поведение для организации обработки событий, во многом похожий на gen_server по набору функций. Важным отличием gen_event от gen_server является возможность динамически добавлять или убирать несколько обработчиков событий, тогда как обобщённый сервер получает модуль функций обратного вызова при запуске. Так как обработкой событий занимаются различные модули, следует проявлять осторожность в обращении с состоянием циклаШаблон:Sfn.

Конечный автомат (gen_fsm)

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

Наблюдатель (supervisor)

В задачи наблюдателя входит запуск, остановка и слежение за дочерними процессами, которые в свою очередь могут быть процессами-наблюдателями и рабочими процессами других типов[5]. Корневой наблюдатель, то есть, наблюдатель приложения, следящий за другими процессами, обычно получает имя вида название_приложения_supШаблон:Sfn.

Приложение (application)

В контексте OTP приложение имеет особый смысл — это программный компонент (или Шаблон:Нп3Шаблон:Sfn), состоящий из набора файлов модулей и файлов метаданных, имеющих определённую соглашением структуру файлов на дискеШаблон:Sfn. Приложение OTP может быть запущено и остановлено Erlang-системой как единое целое по имени. Модуль поведения application обычно имеет имя вида имя_приложения_app и требует экспорта всего двух функций: start/1 и stop/1Шаблон:Sfn.

Возможности

Erlang/OTP предлагает разработчикам приложений следующие возможностиШаблон:Sfn:

  • Изоляция (Шаблон:Lang-en) — влияние ошибки в одной части системы на другие минимально.
  • Избыточность (Шаблон:Lang-en) и автоматическое восстановление после отказа (Шаблон:Lang-en) — в случае отказа компонента, другой может принять его функцию за счёт использования процессов-наблюдателей.
  • Обнаружение неисправностей (Шаблон:Lang-en) с помощью инструментов Erlang-системы и интегрированные средства для выявления причин ошибок.
  • Горячее обновление кода — средства для обновления программного обеспечения без остановки системы.

OTP в Elixir

Язык Elixir позволяет использовать поведения и приложения OTP. Следующий пример показывает сервер, вычисляющий значение функции. Все функции, связанные с работой сервера, делегированы GenServerШаблон:Sfn:

defmodule Dup.Server do
  use GenServer
  def handle_call(:calc_double, _from, x) do        
    {:reply, x, 2 * x}
  end
end

Функция handle_call получает от (игнорируемого в данном примере) клиента _from, а также текущее состояние сервера x. Возвращает текущее состояние и удваивает переменную состояния.

Примечания

Шаблон:Примечания

Литература

Ссылки

  1. Joe Armstrong, Making reliable distributed systems in the presence of software errors Шаблон:Wayback, a dissertation, 2003
  2. Шаблон:Cite web
  3. Терминология книги Martin Logan, et al. Документация по Erlang/ORP говорит лишь о процессах.
  4. Шаблон:Cite web
  5. Шаблон:Cite web