Статьи

Маленький эликсир: поведение OTP

В этой статье, взятой из моей книги «Маленький эликсир и руководство по OTP» , я познакомлю вас с поведением OTP.

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

Взять, к примеру, GenServer. GenServer предоставляет вам функциональность клиент / сервер из коробки. В частности, он обеспечивает функциональность, общую для всех серверов. Каковы эти общие черты? Они есть:

  1. Порождение процесса сервера

  2. Поддержание состояния на сервере

  3. Обработка запросов и отправка ответов обратно

  4. Остановка серверного процесса  

У GenServer есть общая сторона. Вы, с другой стороны, должны предоставить бизнес-логику. Конкретная логика, которую вы должны предоставить: 

  1. Состояние, с которым вы хотите инициализировать сервер

  2. Типы сообщений, обрабатываемых сервером

  3. Когда ответить клиенту

  4. Какое сообщение ответить клиенту

  5. Какие ресурсы убирать после окончания 

Есть и другие преимущества. Например, когда вы создаете свое серверное приложение, как вы узнали, что вы охватили все необходимые пограничные случаи и проблемы параллелизма, которые могут возникнуть? Кроме того, было бы неинтересно понимать различные реализации логики сервера.

В моих программах, которые не используют поведение GenServer, я обычно называю основной цикл, ну, цикл. Тем не менее, никто не может помешать назвать его «await», «recur» или даже что-то смешное, например «while_1_true». Использование поведения GenServer освобождает меня (и, скорее всего, разработчика с вызовами имен) от необходимости думать об этих мелочах.

Различное поведение OTP 

В следующей таблице перечислены распространенные поведения OTP, которые предоставляются «из коробки». ОТП не ограничивает вас этими четырьмя. На самом деле, вы можете реализовать свое собственное поведение. Тем не менее, необходимо понять, как правильно использовать стандартные, потому что они охватывают большинство случаев использования, с которыми вы когда-либо сталкивались.

Таблица 1. Поведение OTP и предоставляемые ими функциональные возможности.

Поведение

Описание

GenServer

Модуль поведения для реализации сервера отношения клиент-сервер.

GenEvent

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

Руководитель

Модуль поведения для реализации функций контроля

заявка

Модуль для работы с приложениями и определения обратных вызовов приложений.

Чтобы сделать вещи более конкретными, мы можем сами убедиться, как эти модели поведения сочетаются друг с другом. Для этого нам нужен инструмент Observer, предоставляемый OTP бесплатно. Запустите iex и запустите Observer:

Листинг 1: Запуск инструмента Observer

% iex
iex(1)> :observer.start
:ok

Когда появится окно, нажмите на вкладку «Приложения». Вы должны увидеть что-то вроде этого:

Рисунок 1: Инструмент Observer, отображающий дерево супервизора приложения Kernel

В левом столбце приведен список приложений OTP, которые были запущены при запуске iex. Каждый параметр в левом столбце показывает иерархию супервизора . Например, приведенная выше диаграмма показывает иерархию супервизора для приложения ядра, которое запускается самым первым приложением, даже до запуска приложения elixir.

Если вы внимательно присмотритесь, вы заметите, что у супервизоров есть добавленный «sup» . « kernel_sup», например, контролирует десять других процессов. Эти процессы содержат как супервизоры, так и GenServers.

Поведения, такие как GenServer и GenEvent, являются рабочими . Они содержат большую часть бизнес-логики и выполняют большую часть тяжелой работы. Надеюсь, это дало вам общее представление о том, как сочетается поведение OTP.

Эта статья взята из «Маленького эликсира и руководства OTP» . Сэкономьте 39% с кодом  tanweihao39 на manning.com .