Open Telecom Platform

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Erlang/OTP
Erlang logo.png
Тип

Программный каркас

Разработчик

Ericsson

Написана на

Erlang

Операционная система

Кроссплатформенный

Первый выпуск

1996

Последняя версия

R16B03-1 (28 января 2014 г.)

Лицензия

Erlang Public License

Сайт

erlang.org

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

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

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

Основные понятия[править | править исходный текст]

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

Дерево процессов

Поведение OTP строится из рабочих процессов (англ. worker process) и процессов-наблюдателей (англ. supervision process), составляющих дерево наблюдения (англ. supervision tree).

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

Составные части поведения[править | править исходный текст]

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

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

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

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

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

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

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

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

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

Основные поведения и OTP-приложения[править | править исходный текст]

Обобщённый сервер (gen_server)[править | править исходный текст]

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

-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 обычно являются обёртками для вызова соответствующих функций библиотеки. Продолжая предыдущий пример[10]:

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

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

Модуль обобщённого сервера 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 является возможность динамически добавлять или убирать несколько обработчиков событий, тогда как обобщённый сервер получает модуль функций обратного вызова при запуске. Так как обработкой событий занимаются различные модули, следует проявлять осторожность в обращении с состоянием цикла[12].

Наблюдатель (supervisor)[править | править исходный текст]

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

Конечный автомат (gen_fsm)[править | править исходный текст]

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

Приложение (application)[править | править исходный текст]

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

Возможности[править | править исходный текст]

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

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

Примечания[править | править исходный текст]

Литература[править | править исходный текст]

  • Martin Logan, Eric Merritt, Richard Carlsson Erlang and OTP in Action. — Manning, 2011. — 397 p. — ISBN 9781933988788
  • Чезарини Ф., Томпсон С. Программирование в Erlang = Erlang Programming. — М.: ДМК Пресс, 2012. — 488 с. — ISBN 978-5-94074-617-1
  • Armstrong, Joe (January 2007). "A History of Erlang" in HOPL III. Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages: 6−1—6-26, San Diego, California: ACM. DOI:10.1145/1238844.1238850. 978-1-59593-766-7. Проверено 2013-12-06. 
  • Dan McCreary, Ann Kelly 10.5. Case study: building NoSQL systems with Erlang // Making Sense of NoSQL: A guide for managers and the rest of us. — Manning Publications, 2013. — 312 p. — ISBN 978-1-61729-107-4
  • Francesco Cesarini, Andy Gross, and Justin Sheehy. Riak and Erlang/OTP

Ссылки[править | править исходный текст]