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

Доступны полноценные клиентские привязки для PHP, доступные в виде модуля или встроенного процесса. Для интеграции требуется запуск в окружении приложения Enduro/X либо через tpbridge-процесс. Исходный код размещён на [1].

Enduro/X-Perl

Поддерживаются клиентские и серверные привязки для Perl. Модуль доступен на [2].

Приобретение

В феврале 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, что позволяет коммерческое использование.

Примечания

Ссылки