В этой статье я расскажу о том, как мы стали друзьями Кэш + Эрланг , и зачем нам это нужно.
В качестве хранилища данных была выбрана СУБД Cache. Мы также создали и работаем MCA (промежуточное ПО для приложений кэширования) — промежуточное программное обеспечение, обеспечивающее конкурентоспособную модель взаимодействия Erlang и Cache. Для взаимодействия Erlang и Intersystems Cache реализованы следующие возможности:
- Обработка сообщений из Erlang в Cache, переводя кортежи Erlang (внутренний формат данных дерева Erlang) в глобальные переменные Cache.
- Отправляйте сообщения из Cache в процессы Erlang, переводя глобальные значения Cache в кортежи Erlang.
- Диспетчер сообщений (MD) — управляет обменом сообщениями в конкурентных условиях между различными Erlang-узел(EN) и Cache процессов, обеспечивает кэширование сообщений по определенным правилам.
Запускается в соответствующем EN.
- C-узел — обеспечивает загрузку библиотек C/C++ и обмен сообщениями между ними, взаимодействие системы с общей памятью, EN, CallIn/CallOut (функционал реализован в Cache на языке C) и т.д. На данный момент у нас подключены библиотеки в C-node для веб-приложений, использующих Cache для поддержки преобразования XSLT и обработки регулярных выражений.
- Порте – Шлюз обмена сообщениями с MD для кэша.
Запускается как отдельное фоновое задание, которое мы назовем Порте-джоб(PJ) .
доктор медицинских наук
MD получает запросы от веб-сервера рыскание (напомню: yaws тоже пишется на Эрланге).MD проверяет, есть ли такой запрос в обрабатываемой в данный момент очереди или в кэше ответов.
Если все пусто, запрос добавляется в очередь.
Когда ответ будет готов, MD вернет его всем, кто запросил его за это время.
Настройки MD позволяют хранить на этом уровне кэш ответов; memcache используется на более высоких уровнях.
Справедливости ради скажу, что мы не используем кеширование на уровне MD, но такая возможность есть.
Количество одновременно обрабатываемых запросов MD равно количеству запросов, полученных от веб-сервера yaws — то есть случайной величине.
C-узел
C-Node гарантирует, что он ожидает сообщений от EN, передает запросы подключенным библиотекам и Cache и отправляет обратно результат запроса.Для каждого работающего C-узла существует один работающий PJ (процесс в миксе, который обрабатывает запрос).
В PJ данные запроса вводятся в уникальный глобальный узел (с помощью CallIn).
При этом параметры запроса в виде Erlang-текстов преобразуются в ветки глобала.
Сразу после завершения входа в глобал начинается обработка запроса.
Фактически, благодаря наличию C-Node каждый PJ по отношению к Erlang выглядит как набор обычных EN (Erlang-node).
Кроме того, в частности, при использовании C-узла XSLT-преобразование вызывается для XML-файла, созданного в Cache. После выполнения XSLT вы получаете готовый HTML, который возвращается обратно в MD — а затем на веб-сервер.
Порте
Porte — это процесс, работающий непосредственно в Cache. Запрос обрабатывается с использованием упрощенного механизма логического вывода.Существует глобальный запрос и глобальный правила — на основе глобального запроса выбираются определенные правила и выполняются определенные действия в Кэше.
Также на этом уровне определяется набор преобразований, которые необходимо выполнить после обработки внутри Cache (обычно это выбор того или иного XSLT-преобразования).
Зачем нам это надо
Промежуточное программное обеспечение используется для связи с кэшем с запросами из внешнего мира.С его помощью система справляется с большими нагрузками при ограниченных вычислительных ресурсах или нехватке PJ. Также есть удобная возможность использовать для разработки интерфейсов не только встроенные в Cache инструменты csp/zen, но и все остальные методы реализации интерфейсов (в нашем случае это цепочка xml-xslt-html).
Эрланг был выбран потому, что внутренний формат данных в нем, как и в Cache, древовидный; замена деревьев не требует серьезных промежуточных преобразований.
Yaws был выбран еще и потому, что он написан на Erlang — таким образом достигается высокая степень однородности всей системы в целом.
Само хранение данных реализовано в Cache по принципу глобалов правил.
То есть даже внутренние процессы, которые напрямую не взаимодействуют с внешним миром, получают на вход глобал данных («фактов») и на основе глобала правил выбирают набор необходимых действий и преобразований.
P.S.: Некоторые части статьи скопированы из наших внутренних документов, ссылки на которые я предоставить не могу.
Я не принимал непосредственного участия в разработке промежуточного программного обеспечения, но постараюсь ответить на все возникающие вопросы, в этом случае обращусь за советом к своим старшим товарищам.
Я принимал участие в проектировании и реализации хранилища данных, то есть всего того, что происходит после попадания данных в Порте и до возврата ответа в EN. Если интересно, могу подробно описать, как реализовано хранилище, какие подсистемы в нем используются (словари, индексирование, вывод) и так далее.
Теги: #база данных #кэш #erlang #разработка сайтов #Erlang/OTP
-
Asus «Gui Bios»
19 Oct, 24 -
Золотое Правило Git Rebase
19 Oct, 24 -
Эффект Бабочки
19 Oct, 24 -
Totalfinder — Удобный Плагин Для Finder
19 Oct, 24 -
Еще Один Способ Смотреть Телевизор: Slingbox
19 Oct, 24 -
Переводчик Го Обероны
19 Oct, 24