Enduro/X
Enduro/X — открытая платформа промежуточного программного обеспечения для распределённой обработки транзакций. Построена на проверенных API, таких как XATMI и XA группы X/Open. Платформа предназначена для создания приложений на базе микроcервисов в режиме реального времени с возможностью кластеризации. Enduro/X может служить расширенной заменой Oracle Tuxedo. Для межпроцессного взаимодействия используются оперативные POSIX-очереди сообщений, что обеспечивает высокую пропускную способность обмена сообщениями между процессами.
Общие сведения
| Enduro/X | |
|---|---|
| Тип | сервер приложений, промежуточное программное обеспечение, система обмена корпоративными сообщениями, SOA |
| Разработчик | Mavimax SIA |
| Написана на | C, C++, Go, Java |
| Операционные системы | Linux, FreeBSD, IBM AIX, Oracle Solaris, Cygwin, macOS |
| Последняя версия | 8.0.10 (26 ноября 2023) |
| Репозиторий | github.com/endurox-dev/e… |
| Лицензия | AGPL v3 или коммерческая; LGPL v3 для Java и Go |
| Сайт | endurox.org |
Возможности
Платформа поддерживает онлайн-патчинг системы без прерывания работы сервисов. Выполняется мониторинг запущенных процессов с автоматическим перезапуском при аварийном завершении или зависании. Конфигурация системы может быть динамически перезагружена; реализованы средства кластеризации, позволяющие соединять экземпляры в режиме peer-to-peer. Ядро Enduro/X написано на C, предоставляет нативные API для C и C++. Mavimax поддерживает языковые привязки для Go и Java, а сообщество — для Python, PHP и Perl. Это позволяет использовать Enduro/X как средство межъязыковой интеграции между поддерживаемыми языками.
Технологии
Enduro/X работает на ядрах Linux начиная с версии 2.6.12. Ключевой функцией Linux служит epoll() для POSIX-очередей, что реализует схему «одна очередь — несколько серверов»: серверы Enduro/X опрашивают очереди. Разработчики Enduro/X инициировали включение флага EPOLLEXCLUSIVE в основную ветку Linux (с версии 4.5)[1], что позволило существенно ускорить отклик Enduro/X при большом числе процессов. В тесте производительность нагрузки улучшилась с 860 до 24 секунд[2].
С версии 3.1.2 реализована поддержка FreeBSD, IBM AIX (6.1 и 7.1) и Oracle Solaris v11 (производственная), а также экспериментальная поддержка macOS и Cygwin. На ОС, где доступны POSIX-очереди, для каждой ATMI-пары сервер/сервис выделяется отдельная очередь, вызывающие процессы выбирают очередь по кругу. В macOS очереди эмулируются на основе memory-mapped файлов с использованием межпроцессных мьютексов. В FreeBSD очереди сообщений также поддерживают polling с помощью kqueue, реализуя ту же схему, что в Linux.
Начиная с версии 6.0, для Unix-платформ отличных от FreeBSD и Linux как основное IPC используется очереди System V, что также обеспечивает распределение нагрузки между серверами по схеме SQMS («одна очередь — несколько серверов»). Данный режим работает на Oracle Solaris и IBM AIX. Для macOS продолжают использоваться эмулированные очереди из-за невозможности менять их ёмкость средствами ОС.
Основные функции
- Стандартизованные API: SCA, The Open Group XATMI
- Типы коммуникаций: синхронная, асинхронная, конверсационная, публикация-подписка
- Типизированные буферы:
- UBF (Unified Buffer Format) — бинарный протокол высокой производительности, эмулирует Tuxedo FML/FML32; с версии 8.0 поддержка рекурсивных буферов, PTR- и VIEW-полей
- STRING — буфер строк
- CARRAY — массив байт
- JSON, автоматическое преобразование между JSON и UBF
- VIEW (с версии 5.0+) — обмен структурами C между процессами (мультиплатформенно), с сопоставлением полей UBF/VIEW
- Управление транзакциями: глобальные транзакции, двухфазный коммит, X/Open XA
- Эмуляция интерфейса XA для PostgreSQL
- Кластеризация (peer-to-peer)
- Event broker (публикация/подписка)
- Мониторинг процессов и автоматическое восстановление
- Кэширование сервисов SOA: возврат результатов из быстрого (память/LMDB) кеша
- Динамическая переконфигурация сервера
- Пользовательские расширения для polling серверов
- Работа без основного процесса-демона appserver (ndrxd)
- Основной демон appserver может быть перезапущен без остановки системы; после запуска некоторое время работает в режиме сбора инфо для автонастройки
- Поддержка вызова
tpforward() - ATMI-серверы могут выступать как клиенты (вызывать
tpcall()) - Управление тайм-аутами вызовов через API
tptoutset() - Детализированное логирование и трассировка с настройкой уровней логов по каждому исполняемому файлу; возможно дебажить внешними IDE и инструментами (например, Valgrind)
- Проект использует автоматическое юнит- и интеграционное тестирование
- Встроенный профайлер ATMI-сервисов
- Горячее обновление переменных окружения ATMI-серверов без полной перезагрузки приложения
- Универсальный монитор клиентских процессов (cpm): автоматический перезапуск и «массовое» управление через regex-маски
- С версии 5.2 — шифрование конфигов для соответствия PCI DSS
- С версии 6.0.17 — лимиты на память для процессов с их мягким перезапуском при превышении, полезно при утечках памяти
- TMIB API для сбора информации о системе
- Агент мониторинга NetXMS для процессов и очередей
- Полная поддержка средств сборки (buildserver, buildclient, buildtms)[3]
- Многопоточная диспетчеризация XATMI-сервисов
- Data Dependent Routing (маршрутизация по содержимому сообщения)
- Автоматические транзакции для XATMI-серверов
- Приоритеты обслуживания сервисов
- Онлайн изменение настройки логов и ротация лог-файлов
- Latent Command Framework — публикация команд на лету для процессов
Производительность
Ряд сравнительных тестов показывает, что Enduro/X сопоставим по производительности с Oracle Tuxedo и ZeroMQ. В диапазоне пакетов данных 56 КБ скорость обработки у Enduro/X была выше Tuxedo на 30 %[4]. При объёме 10–20 КБ Enduro/X значительно опережает ZeroMQ[5]. В тестах с RabbitMQ Enduro/X показал преимущество, особенно в RPC-вызовах — во много раз быстрее; для однонаправленных передач RabbitMQ приблизился к Enduro/X[6].
Подсистемы
Enduro/X включает ряд подмодулей, расширяющих возможности серверной платформы.
Система TMQ (Transactional Message Queue) обеспечивает поддержу устойчивых очередей с возможностью явного помещения и извлечения сообщений по именованным очередям. Очереди могут быть упорядочены по времени помещения в режимах LIFO и FIFO. Управление осуществляется менеджером ресурсов с поддержкой XA-транзакций. Предусмотрена автоматическая обработка очередей с вызовом соответствующих сервисов Enduro/X ATMI и помещением ответов и неудачных сообщений в сервисные очереди.
Входит специальный сервер XATMI, позволяющий читать конфигурационные файлы в формате INI через вызовы tpcall(). Возможно использование наследования ключей и секций.
Введён API tplog для высокопроизводительного логирования на C, как внутреннего, так и пользовательского. Поддерживается логирование по потокам, а также «request logging» (отдельные логи для каждого запроса — по id сессии, имени пользователя и др.).
Enduro/X Connect
Пакет Enduro/X Connect предоставляет средства экспорта XATMI-сервисов во внешний мир (например, через REST-интерфейс), с автоматическим преобразованием форматов сообщений (включая JSON). Модуль поддерживает загрузку файлов, обслуживание статического контента и оркестрацию глобальных транзакций по веб-интерфейсу. Также реализован двунаправленный TCP/IP-коннектор для обмена XATMI-сообщениями через сокеты, что востребовано в IoT и банковских системах (например, для поддержки ISO 8583)[7].
Сервер приложений для Go (ASG)
ASG — проект привязок для Go поверх Enduro/X, позиционируемый как сервер приложений для Go. Позволяет исполнять отдельные бинарные сервисы без состояния, перезагружать их без остановки, строить распределённые транзакционные системы на Go. Разработчики подготовили модифицированные драйверы Oracle DB OCI8 с поддержкой XA-транзакций. ASG стал первым решением для распределённых транзакций на Go.
Enduro/X Java
С версии 7.0 реализованы привязки для Java. Серверы и клиенты XATMI могут быть полностью написаны на Java в схеме мультипроцессного исполнения (каждый процесс содержит свою [JVM]). Требования к классам минимальны; возможно рассматривать сервер как POJO-приложение. Управление транзакциями осуществляется через стандартный менеджер Enduro/X c использованием JDBC-драйверов. Предусмотрен Java Linker-процесс (exjld) — возможность связывать jar-файлы к стандартному исполняемому файлу с зависимостями (libjvm, libjava). Это облегчает доставку программ на Java — каждое приложение может содержать свои зависимости.
Поддерживаются запуск как внешних Java-программ с classpath, так и связанных бинарников; демон ndrxd обслуживает оба варианта.
Enduro/X-PHP
Приобретение
В феврале 2017 года все права на Enduro/X были приобретены у ATR Baltic компанией Mavimax Ltd, включая исходные коды и текущие соглашения[8].
История
Разработка Enduro/X началась как закрытый проект ATR Baltic в декабре 2009 года. Первые промышленные внедрения (преимущественно в банках) состоялись в конце 2012 года с выпуском версии 1.0. В 2015 году (версия 2.3.2) проект был открыт, и дальнейшая разработка ведётся публично. С каждым крупным релизом добавляются новые возможности. До версии 6.0 Enduro/X распространялся под GPLv2, а с 6.0 — под AGPLv3. С версии 7.0 лицензия смягчена для использования в Java и Go: по заявлению разработчиков, AGPL не распространяется на код на Go и Java, использующий Enduro/X. Поэтому модули Enduro/X для Java и Go (ASG) выходят под LGPL v3, что позволяет коммерческое использование.