Оркестровка двигателей и рамок?
Я ищу структуру / механизм / инструментарий оркестровки, с помощью которого можно заменить / обновить существующее программное обеспечение, главным образом из-за ограничений масштабируемости. Под оркестровкой я подразумеваю асинхронное и распределенное выполнение общих задач и рабочих процессов.
Более конкретно, требования в значительной степени таковы:
- Обтекание и выполнение общих задач, в Java, если зависит от языка
- API для запуска задач и рабочих процессов по требованию
- Планирование было бы также хорошо
- Поддержка распределенной архитектуры и масштабируемости (в основном для большого количества небольших задач)
- Стойкость и устойчивость
- Расширенные возможности настройки рабочего процесса (выполните это, затем эти 3 задачи параллельно, затем, имея приоритеты, зависимости...)
- Пользовательский интерфейс мониторинга и администрирования (или хотя бы API)
Существующая система является старомодным монолитным сервисом (в Java), который имеет большую часть этого, включая саму логику выполнения, которая должна оставаться как можно более нетронутой.
У кого-нибудь есть опыт работы с подобной проблемой? Мне кажется, что это должно быть довольно распространенным, было бы странно, если бы мне пришлось полностью это реализовать. Здесь я нашел несколько вопросов (таких как этот и этот), в которых обсуждается теория оркестровки и системы хореографии, но не реальные примеры инструментов, реализующих ее. Кроме того, я думаю, что мы не совсем говорим о микросервисах - задачи не являются длительными и тяжелыми, они просто выполняются в фоновом режиме, выполняя короткие задания многих типов. Я бы не стал создавать сервис для каждого типа работы.
Я также не ищу облачные и контейнерные сервисы на данный момент - насколько я понимаю, развертывание - это другая проблема.
Самым близким, что я получил, является движок Netflix Conductor, который отвечает большинству требований, запуская сервер оркестрации, который управляет задачами, реализованными в сервлетах (или любых веб-службах на любом языке - плюс). Однако, похоже, что он построен в основном для организации тяжелых задач в рабочем процессе, а не для выполнения огромного количества небольших задач, что заставляет меня задуматься над тем, что может быть непроизводительным, например, при вызове множества небольших задач в сервлетах.
У кого-нибудь есть опыт или какой-либо вклад в Проводник или другие инструменты, которые я мог бы использовать? Или даже весь мой подход к проблеме?
РЕДАКТИРОВАТЬ: Я понимаю, что это своего рода "совет исследования необходимы", поэтому давайте просто скажем, в 3 вопроса:
- Правильно ли я искать решение для оркестровки для вышеуказанных требований?
- У кого-нибудь есть опыт работы с проводником Netflix? Есть какие-либо отзывы об этом?
- У него есть хорошие конкуренты?
1 ответ
Главный конкурент Netflix Conductor - Temporal Workflow. Он лучше масштабируется и более удобен для разработчиков за счет использования кода вместо JSON DSL для реализации логики оркестровки.
Он также хорошо работает с мелкозернистыми задачами за счет реализации определенных оптимизаций (локальных действий), которые позволяют объединять несколько небольших задач в одно обновление базы данных.
Temporal более четырех лет тестируется в Uber, Coinbase, HashiCorp и десятках других компаний.
Возможно, вы ищете что-то вроде Airflow https://airflow.apache.org/?
Обтекание и выполнение общих задач, в Java, если зависит от языка
https://github.com/apache/incubator-airflow/tree/master/airflow/hooks https://github.com/apache/incubator-airflow/tree/master/airflow/contrib/operators
API для запуска задач и рабочих процессов по требованию
https://airflow.apache.org/api.html (экспериментальный)
Планирование было бы также хорошо
подумайте о cron на стероидах - https://airflow.apache.org/scheduler.html
Поддержка распределенной архитектуры и масштабируемости (в основном для большого количества небольших задач)
чешуйка с узлами из даска или сельдерея - Airflow + сельдерей или даска Для чего, когда?
Стойкость и устойчивость
использует postgres db & rabbitMQ - если ваша арка развертывания не имеет состояния (например, повторяемые контейнеры и тома с докером), вы должны быть в хорошей форме с репликацией WAL, если вы используете Kubernetes или Consul, есть другие способы повысить устойчивость других компонентов
Расширенные возможности настройки рабочего процесса (выполните это, затем эти 3 задачи параллельно, затем, имея приоритеты, зависимости...)
Воздушный поток использует DAG. Возможности можно назвать достаточно продвинутыми. У вас также есть общий доступ к параметрам с помощью XCOM, если вам это действительно нужно
Пользовательский интерфейс мониторинга и администрирования (или хотя бы API)
Имеет один, показывает задачи и графики и имеет вид Ганта. также можно легко просматривать журналы и подробности выполнения, а также вручную планировать задачи непосредственно из пользовательского интерфейса.
также посмотрите на Oozie & Azkaban
это помогло?
Вы можете взглянуть на unify-flowret, легкий механизм оркестровки Java, который я создал в рамках разработки новой платформы в American Express. Если вы думаете, что Netflix Conductor подходит для вашей проблемы, вам обязательно стоит взглянуть на unify-flowret, поскольку Netflix Conductor был одним из вариантов, которые мы оценивали перед созданием unify-flowret.
Unify-flowret обеспечивает базовую функциональность оркестровки, а все остальное зависит от приложения. Вы определяете рабочий процесс в очень простом файле JSON, используя шаги и маршруты. Затем в приложении, которое хочет использовать flowret, вы создаете определенные реализации, например, реализацию для сохранения состояния в базе данных (таким образом можно использовать любое хранилище данных). Или реализация для возврата объекта в flowret, на котором flowret будет вызывать функцию шага. Таким образом, вместо того, чтобы реализовывать все типы требований в механизме оркестрации, чтобы упростить задачу, большинство из них возлагается на приложение.
Unify-flowret работает во встроенном режиме и масштабируется по горизонтали. Он возобновляется с того места, где остановился. Он устойчив к сбоям и возобновит работу с последней записанной позиции. Он обеспечивает настоящую техническую параллельную обработку посредством определения в JSON рабочего процесса. Он обеспечивает структуру SLA, которая информирует приложение о вехах, которые должны быть установлены в будущем. Он предоставляет функции управления работой в виде рабочих корзин. И многое другое!
Мы добились большого успеха в использовании его в American Express для действительно сложных требований оркестровки.
Вы можете оформить заказ на unify-flowret на https://github.com/americanexpress/unify-flowret.