Эта статья начинает серию публикаций о технологиях, которые мы используем и изучаем для разработки сервиса мониторинга веб-сайтов.
Надеемся, наш опыт будет полезен.
Передача сообщений — одна из популярных концепций параллельного программирования.
Его часто используют для создания сложных распределенных систем с высокой степенью параллелизма.
Реализация этой концепции представлена в языках программирования в виде актеров или агентов.
Распределенные агенты 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 #Функциональное программирование
-
Стать Разработчиком Iphone И Цель Обучения C
19 Oct, 24 -
Сидкэмп 2008
19 Oct, 24 -
День Рождения Пушкина
19 Oct, 24