Концепция Передачи Сообщений. Агенты И Актеры

Эта статья начинает серию публикаций о технологиях, которые мы используем и изучаем для разработки сервиса мониторинга веб-сайтов.

ХостТрекер .

Надеемся, наш опыт будет полезен.

Передача сообщений — одна из популярных концепций параллельного программирования.

Его часто используют для создания сложных распределенных систем с высокой степенью параллелизма.

Реализация этой концепции представлена в языках программирования в виде актеров или агентов.



Концепция передачи сообщений.
</p><p>
 Агенты и актеры

Распределенные агенты HostTracker. Быстрая проверка с помощью http://updownchecker.com



Особенности передачи сообщений:
• Решение состоит из изолированных компонентов, которые работают параллельно (в параллельных потоках из пула потоков).

Взаимодействие между компонентами происходит посредством обмена сообщениями по определенному протоколу.

Сетевые компоненты могут использовать TCP, UDP, HTTP и т. д. Локальные пользователи взаимодействуют через протокол, определенный его конкретным языком реализации или библиотекой.

• Компонент определяет логику обработки входных сообщений.

Последние попадают в очередь и последовательно удаляются из нее для обработки.

• Компонент может быть владельцем некоторых ресурсов и быть их поставщиком для других компонентов.

Ресурсом могут быть: данные определенного формата в оперативной памяти, аппаратно-программный ресурс или комбинация того и другого.

• Компонент имеет определенное состояние, которое может инкапсулировать ресурс (из предыдущего пункта) или, как в случае с конечным автоматом, может быть выражено как определенный алгоритм обработки сообщений, переводящий его в другое состояние.

• Интерфейс между компонентами: — postSync, postAsync — отправить сообщение компоненту синхронно или асинхронно.

— полученияSync, полученияAsync – получить сообщение от компонента синхронно или асинхронно.

Асинхронное ожидание означает, что поток как ресурс возвращается в систему и может быть использован для другой работы.

В этом случае система регистрирует функцию обратного вызова для конкретного события.

— функции tryReceive – аналогичны перечисленным выше, но с определенной задержкой получения данных.

• Эта концепция тесно связана с концепцией асинхронного выполнения.



Асинхронное и параллельное выполнение
Асинхронное выполнение означает, что поток не ждет результата конкретной операции, используя ресурсы операционной системы.

Вместо этого поток возвращается в пул и может использоваться для других операций.

В этом случае в ОС регистрируется функция обратного вызова, которая получает результат асинхронной операции.

Эта функция запускается при получении результата (в ОС Windows через механизм портов IO Completion, в Nix-системах через другие механизмы ядра).



Реализация концепции передачи сообщений
Выполнение Язык Тип взаимодействия Особенности Разработчик Эрланг-процессы Эрланг локальная сеть Первая реализация для телекоммуникационного оборудования.

Может использоваться для работы в сети.

Определен метод отправки сообщений вида Pid! сообщение и получить с сопоставлением шаблона сообщения.

Компания Эриксон.

Почтовый ящикПроцессор Ф# местный Использует асинхронные вычисления.

Дополнительно появляется понятие канала ответа — AsyncReplyChannel, позволяющее получать ответ синхронно и асинхронно.

Исследование Microsoft Поток данных TPL .

NET-языки местный Набор примитивов — блоков, реализующих приёмники и источники данных.

Майкрософт Актеры Скалы Скала (Java-машина) локальная сеть Реализация напоминает классическую — Erlang-процессы.

EPFL, Typesafe Inc. NodeJs JavaScript сеть Событийно-ориентированный подход к разработке приложений: декларативное определение асинхронных операций и обратных вызовов, очередь вызовов обработчиков событий.

Внешний интерфейс определяется разработчиком приложения.

Джойент Инк.

ИМБ: MPICH, HP-MPI, SGI-MPI, WMPI, С, С++, Ява, Фортран сеть Указанный интерфейс взаимодействия узлов сети.

Единый исполняемый код для всех узлов с выбором ветки исполнения по идентификатору процесса.

Microsoft, HP, SGI, Аргоннская национальная лаборатория и другие.

Разные языки программирования поддерживают эту концепцию по-разному.

Таким образом, JavaScript (платформа NodeJs) является примером Event-Driven языка (языка, имеющего встроенную поддержку работы с асинхронными вычислениями).

Типичная программа NodeJs — это декларативная регистрация функций обратного вызова для ответов на события ввода-вывода.

В начале его выполнения создается очередь операций, в которой выполняются функции обратного вызова.

То есть сама программа однопоточная, но асинхронная.

То есть сама программа однопоточная, но асинхронная.

В данном случае виртуальная машина NodeJs (на основе среды выполнения JavaScript Chrome v8) является примером реализации передачи сообщений и удовлетворяет всем вышеперечисленным условиям, если она реализует определенный сетевой интерфейс для взаимодействия с другими компонентами распределенного приложения (например, , служба REST).

В некоторых языках (например, F# — асинхронная монада, C# — async, await) существует понятие асинхронных вычислений — определенной разработчиком части кода, содержащей как синхронные, так и асинхронные операции.

Также есть возможность запустить вычисления в параллельном потоке, отменить вычисления или выполнить синхронный старт.

Примеры реализации концепции передачи сообщений
Концепция передачи сообщений была впервые представлена в Erlang (функциональном языке с динамической типизацией), который был разработан компанией Ericson для специализированного телекоммуникационного оборудования.

Процессы Erlang — это компоненты, описанные ранее.

Их создание и обмен данными между ними, в отличие от процессов ОС, не требуют значительного временного ресурса.

Современные функциональные языки, такие как Scala (платформа Java) и F# (платформа .

NET), взяли реализацию передачи сообщений от Erlang. Агенты Scala могут существовать либо внутри одного процесса ОС, либо в разных процессах на разных компьютерах.

Принципы работы с ними аналогичны принципам процессов Erlang. F# предлагает немного другой подход — MailboxProcessor. Также особенности реализации передачи сообщений можно найти в библиотеке TPL Dataflow, разработанной для языков .

NET TPL Dataflow — .

NET (может использоваться в языках C#, VB, F#); Сетевое взаимодействие построено на принципах передачи сообщений.

Здесь компонент — это программа на отдельной машине, ресурсы — это все аппаратные компоненты компьютера + отдельные функции, которые делегируются этому вычислительному узлу.

Данные хранятся в памяти процесса приложения.

Интерфейс взаимодействия с другими компонентами (узлами) определяется конкретной технологией, обычно создаваемой на сокетах Berkley. Примером такой технологии является MPI (интерфейс передачи сообщений).

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

Нулевой поток выделен.

Обмен данными по сети происходит через интерфейс, аналогичный описанному выше (концепция передачи сообщений), и использует идентификаторы потока для указания источника и/или назначения данных.

Другой пример — сервисы REST и SOAP, которые позволяют разработчику самому определять сетевой интерфейс.

И хотя на первый взгляд кажется, что этот определенный интерфейс не вписывается в концепцию передачи сообщений, он эквивалентен набору операций отправки (отправки) и получения.

Так, в SOAP сетевая функция вызывается путем обращения к HTTP-конверту (конверту), который включает в себя информацию о функции.

Функции в REST работают аналогично — HTTP-запросы используются с форматом данных, определенным разработчиком.

В будущих публикациях будет подробно рассмотрен MailboxProcessor F# (активно используемый в системе).

ХостТрекер ) и особенности работы с библиотекой TPL DataFlow. Теги: #программирование #асинхронное программирование #F# #передача сообщений #передача сообщений #передача сообщений #агенты #актеры #.

NET #Функциональное программирование

Вместе с данным постом часто просматривают: