Сегодня существует множество открытых решений для управления рабочими процессами, которые уменьшают сложность разработки распределенных систем и обеспечивают их надежность. В этом отчете мы проведем глубокий сравнительный анализ четырех ключевых открытых проектов: Temporal, Restate, Hatchet и Inngest.
Обзор и ключевые концепции #
Temporal #
Temporal — это платформа для надежного исполнения (Durable Execution), которая является открытым решением, абстрагирующим сложность построения распределенных систем. Даже в случае сбоя хоста или программного обеспечения он сохраняет полное состояние приложения и обеспечивает бесперебойную миграцию выполнения на другую машину1. Temporal поддерживает ускорение разработки, устраняя необходимость написания пользовательского кода для таймеров, событийного учета, контрольных точек состояния, повторных попыток и тайм-аутов2.
Temporal используется тысячами компаний, включая Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines и Box для критически важных рабочих нагрузок. Сообщается, что все сообщения Twilio, все транзакции Coinbase и все истории Snap используют Temporal1.
Restate #
Restate — это движок для надежного исполнения (Durable Execution Engine), открытый проект для построения безсерверных приложений с состоянием. Написав код, похожий на обычные RPC-сервисы, движок сохраняет прогресс выполнения, восстанавливает предыдущее состояние после сбоя и продолжает выполнение с места остановки3.
Кроме того, Restate автоматически приостанавливает выполнение в ситуациях с высокой задержкой или задержкой ответа от других сервисов, тем самым предотвращая浪费 вычислительных ресурсов. Это означает, что во время “ожидания” сервисы Knative могут масштабироваться до нуля3.
Hatchet #
Hatchet — это распределенная, устойчивая к сбоям очередь задач (distributed, fault-tolerant task queue), разработанная для решения проблем масштабирования, таких как параллельность (concurrency), справедливость (fairness) и ограничение скорости (rate limiting)4. Она позволяет проектировать надежные рабочие нагрузки, которые восстанавливаются после сбоев, заменяя трудные в управлении старые очереди или системы pub/sub5.
Hatchet предлагает низкую задержку (среднее время запуска 25 мс) и высокопроизводительное планирование с встроенными стратегиями, такими как FIFO, LIFO, Round Robin и приоритетная очередь, позволяя обходить обычные проблемы масштабирования с минимальной настройкой6.
Inngest #
Inngest — это открытая платформа для надежных рабочих процессов, работающая во всех облаках. Она позволяет писать функции с длительными этапами выполнения в коде и автоматически повторять их выполнение в случае сбоя7. Она абстрагирует все, что связано с очередями, потоками событий и состоянием, позволяя сосредоточиться на коде.
Inngest была основана в 2021 году бывшим CTO Buffer Дэном Фаррелли и бывшим инженером Docker Тони Холдстоком-Брауном, и в 2023 году компания получила 3 миллиона долларов начальных инвестиций от GGV8.
Сравнение технических характеристик #
Архитектура и технологический стек #
Temporal использует библиотеку grpc, написанную на языке Go, и обеспечивает абстракцию для сохранения полного состояния приложения9. Используя шаблон Worker, он выполняется так, что клиент запускает функции рабочего процесса, но на самом деле выполняет рабочий процесс рабочего9.
Restate открывает сервисы через HTTP/2 и может быть использован вместе с Knative для развертывания безсерверных приложений3. Restate предлагается в виде одного двоичного файла, что делает его простым в выполнении и эксплуатации, и разработан на Rust, что обеспечивает эффективное использование ресурсов и высокую устойчивость10.
Hatchet поддерживает транзакционное планирование на основе Postgres и выполнение в стиле DAG. Он утверждает, что можно горизонтально масштабировать Postgres по нескольким регионам и вертикально масштабироваться более чем до 10k TPS, используя SKIP LOCKED и ключевые функции последних релизов PG11.
Inngest разработан и построен с собственной системой очередей, поддерживающей многопользовательский режим, пакетную обработку и дебаунсинг, и в настоящее время переходит на основание FoundationDB. В основном бэкенд написан на Go, используется кеширование, clickhouse, потоки событий и координация7.
Поддерживаемые языки #
Поддерживаемые языки программирования для каждого проекта следующие:
- Temporal: в результатах поиска неясно указано, но, похоже, основным языком является Go.
- Restate: поддерживает Golang, Java, Kotlin, Typescript, Rust и Python3.
- Hatchet: предлагает открытый SDK для Python, Typescript и Go5.
- Inngest: предоставляет SDK для Typescript (47%), Go (48%), Java, Python с возможностью межязыкового вызова функций712.
Сравнение функций #
Temporal:
- Сохранение полного состояния приложения и миграция на другую машину1
- Автоматическая обработка таймеров, событийного учета, контрольных точек состояния, повторных попыток и тайм-аутов2
- Устранение необходимости в очередях, системах pub/sub и планировщиках1
Restate:
- Обеспечение надежности для кода в стиле RPC3
- Восстановление предыдущего состояния после сбоя и возобновление выполнения с места остановки3
- Автоматическая приостановка выполнения в случае длительной задержки для экономии ресурсов3
- Возможность реализации состояний машины, обработки событий, саг, асинхронных задач и т. д.13
Hatchet:
- Супернизкая задержка (среднее время запуска 25 мс) и высокопроизводительное планирование6
- Встроенные стратегии FIFO, LIFO, Round Robin, Priority Queue4
- Политики пользовательских повторных попыток и интегрированная обработка ошибок4
- Поддержка Cron, одноразового планирования, защиты от всплесков и постепенной потоковой передачи4
Inngest:
- Контроль потока с учетом множественных арендаторов (параллелизм, ограничение скорости, дебаунсинг, приоритет)14
- Поддержка межязыковых вызовов функций7
- Пакетная обработка, группировка большого количества событий в единый вызов функции7
- Внедрение улучшенной панели управления, отслеживание и встроенные метрики7
- Расширенные инструменты восстановления, такие как воспроизведение функции, приостановка и массовое отмена7
Примеры использования и приложения #
Temporal #
Temporal подходит для случаев использования, связанных с оркестрацией сервисов, обработкой транзакций, управлением инфраструктурой, асинхронными задачами и планированием задач1. В частности, он используется крупными компаниями, такими как Stripe, Netflix, Datadog, HashiCorp, Alaska Airlines и Box, для критически важных рабочих нагрузок1.
Restate #
Restate подходит для рабочих процессов, событийно-ориентированных приложений, реализации шаблонов саг и обработки событий с сохранением состояния3. Используя вместе с Knative, он позволяет строить безсерверные приложения с сохранением состояния, даже в условиях нехватки доступности. Кроме того, возможно создание различных приложений, таких как рабочие процессы, саги и обработка событий с сохранением состояния (в сочетании с Knative Eventing)3.
Hatchet #
Hatchet подходит для справедливого распределения запросов для генеративного ИИ (чтобы занятые пользователи не подавляли систему), пакетной обработки документов и изображений, оркестрации рабочих процессов для многомодальных систем и обеспечения точности для обработки событий4.
Inngest #
Inngest подходит для рабочих процессов для агентов ИИ, обеспечения справедливости для генеративного ИИ, пакетной обработки индексации документов и оркестрации рабочих процессов для многомодальных систем14. Он также поддерживает примеры использования, связанные с цепочками функций, индексацией RAG и потоками данных, интеграцией и вебхуками, а также процессами платежей и выставлением счетов7.
Анализ плюсов и минусов #
Temporal #
Плюсы:
- Надежная платформа, проверенная тысячами компаний1
- Высокая надежность благодаря сохранению полного состояния приложения1
- Полностью открытое решение с лицензией MIT1
Минусы:
- Анализ может быть сложным из-за взаимодействия между Go, Rust и TypeScript9
- Сложная внутренняя структура затрудняет анализ информации о передаче данных на уровне протокола9
Restate #
Плюсы:
- Простота запуска и эксплуатации благодаря единому двоичному файлу10
- Высокая эффективность использования ресурсов и надежность (использование Rust)10
- Возможность развертывания как безсерверного/безсостояний HTTP-сервера3
Минусы:
- Относительно новый проект, поэтому экосистема может быть меньше по сравнению с Temporal
- Стратегия развертывания может быть сложной (развертывание с сохранением состояния в k8s-кластере или использование Restate Cloud)3
Hatchet #
Плюсы:
- Уменьшение риска потери данных на основе Postgres (в сравнении с решениями на основе Redis)11
- Низкая задержка (среднее время запуска 25 мс) и высокопроизводительное планирование6
- Внедрение функций наблюдаемости для разработчиков приложений11
Минусы:
- В настоящее время использует RabbitMQ как pub/sub, что создает дополнительные зависимости11
- Рассматривается использование NATS для соединения между движками и работниками; это еще находится в стадии разработки11
Inngest #
Плюсы:
- Дружественный к разработчикам SDK и лаконичный API7
- Предоставляет Dev Server для локальной разработки, что облегчает тестирование и отладку14
- Предоставляет функции контроля потока с учетом множественных арендаторов14
Минусы:
- Лицензия SSPL может затруднить использование в некоторых компаниях15
- Основными языками являются Go (48%) и TypeScript (47%), что может ограничивать поддержку других языков12
Лицензия и сообщество #
Temporal предлагается под лицензией MIT и разрабатывается как открытое решение с активным сообществом1. Лицензия Restate в результатах поиска четко не указана. Hatchet представлен под лицензией MIT5. Inngest предлагается под лицензией Server Side Public License (SSPL) и включает также Apache 2.0 лицензии в рамках задержанной публикации с открытым исходным кодом (DOSP)7.
Заключение #
Все четыре открытых проекта предоставляют решения для надежного исполнения и управления рабочими процессами, однако каждый из них имеет свои уникальные подходы и сильные стороны.
Temporal является наиболее зрелым и широко принятым решением, подходящим для критически важных рабочих нагрузок. Restate сосредоточен на безсерверных приложениях с состоянием и отличается высокой эффективностью использования ресурсов. Hatchet — это работающая на базе Postgres очередь задач, уменьшающая риск потери данных и предоставляющая функции наблюдаемости для разработчиков. Inngest акцентирует внимание на опыте разработчиков и представляет собой платформу для рабочих процессов, работающую во всех облаках с учетом множественных арендаторов.
Выбор проекта может зависеть от специфических требований, существующего технологического стека и профессионализма команды. Однако все четыре решения имеют общую цель: абстрагировать сложность распределенных систем и дать разработчикам возможность сосредоточиться на бизнес-логике.
Справочные материалы #
Вышеизложенное основано на открытой информации о Temporal116217189, Restate31310192021, Hatchet452262311, Inngest87151214242526.
Глубокий сравнительный анализ проектов с открытым исходным кодом Restate и Hatchet #
Restate и Hatchet — это открытые решения, предназначенные для обработки надежных нагрузок в распределенных системах, но их подходы и акценты различаются. В этом отчете мы сравним основные концепции, архитектуру, функции и примеры использования двух проектов, анализируя их преимущества и недостатки.
Основные концепции и цели #
Подход Restate #
Restate — это движок, обеспечивающий надежное исполнение (Durable Execution), который фокусируется на создании устойчивых к сбоям (resilient) приложений с состоянием. При написании кода, похожего на обычные RPC-сервисы, Restate сохраняет прогресс выполнения и, даже в случае сбоя, восстанавливает предыдущее состояние и продолжает выполнение с места остановки27.
Restate придерживается философии “предоставления надежности без изменения способа написания кода”, позволяя разработчикам писать код так же, как и обычные функции и службы27. Это существенно уменьшает нагрузку на разработку сложных распределенных систем.
Подход Hatchet #
Hatchet, напротив, представляет собой распределенную, устойчивая к сбоям очередь задач (distributed, fault-tolerant task queue), сосредоточенную на проектировании рабочих нагрузок, которые восстанавливаются после сбоев, заменяя сложные в управлении старые очереди и системы pub/sub28. Он был разработан с целью решения проблем масштабирования, таких как параллельность (concurrency), справедливость (fairness) и ограничение скорости (rate limiting)28.
Hatchet нацелен на распределение задач между несколькими рабочими с минимальной настройкой и обеспечивает надежное восстановление в случае сбоев. Кроме того, он акцентирует внимание на видимости и наблюдаемости для разработчиков приложений29.
Технические характеристики и архитектура #
Технические характеристики Restate #
Restate обладает следующими ключевыми характеристиками:
Он открывает свои сервисы через HTTP/2 и предлагается в виде одного двоичного файла, что делает его простым в запуске и эксплуатации27. Разработанный на Rust, он отличается эффективностью использования ресурсов и высокой устойчивостью, а также может работать в различных средах, таких как FaaS, Kubernetes, серверы и контейнеры27.
Кроме того, Restate автоматически приостанавливает выполнение в случае долгих ожиданий, тем самым экономя вычислительные ресурсы. Это позволяет эффективно использовать ресурсы во время “ожидания”27.
Технические характеристики Hatchet #
Hatchet предлагает следующие ключевые характеристики:
Он поддерживает транзакционное планирование на основе Postgres и выполнение в стиле DAG (Directed Acyclic Graph)28. Он утверждает, что можно горизонтально масштабировать по нескольким регионам и вертикально масштабироваться более чем до 10k TPS, используя функции SKIP LOCKED и последние релизы PostgreSQL28.
Hatchet обеспечивает низкую задержку (среднее время запуска 25 мс) и высокопроизводительное планирование с встроенными стратегиями FIFO (First In First Out), LIFO (Last In First Out), Round Robin и Priority Queue, позволяя эффективно решать общие проблемы масштабирования с минимальными настройками29.
Сравнение ключевых функций #
Ключевые функции Restate #
Restate предлагает следующие ключевые функции:
Код рабочего процесса: через надежное исполнение код выполняется стабильно даже в случае сбоев27.
Вызовы API и вебхуки: надежное соединение синхронного кода с асинхронными событиями, такими как вебхуки27.
Асинхронные задачи: все функции, вызываемые через Restate, выполняются асинхронно27.
Обработка событий с сохранением состояния: обработка событий из источников событий, таких как Kafka, с предоставлением детализированных повторных попыток и семантики рабочего процесса27.
Надежные сигналы: создание рабочих процессов и обработчиков событий, которые стабильно обрабатывают внешние сигналы, события и пользовательский ввод27.
Идентность: добавление идентности ко всем RPC или обработчикам событий27.
Сага: реализация саг и компенсационных паттернов, представляет собой долгосрочные транзакции, которые отменяются, когда необходимо вернуть предыдущие операции27.
Состояние машины: создание согласованной и масштабируемой машины состояний без использования базы данных или транзакций27.
Ключевые функции Hatchet #
Hatchet предлагает следующие ключевые функции:
Наблюдаемость: возможность полностью отслеживать каждое исполнение, стримить логи и отслеживать задержки, частоту ошибок или пользовательские метрики29.
Практическое надежное исполнение: возможность воспроизводить события и вручную продолжать исполнение на определённом этапе рабочего процесса29.
Крон: установка повторяющегося расписания для выполнения функций29.
Одноразовое планирование: планирование выполнения функций на определенное время и дату29.
Защита от всплесков: мягкое управление всплесками трафика и применение виконального режима выполнения только в рамках пропускной способности системы29.
Постепенная потоковая передача: подписка на обновления по мере выполнения функций на фоновых работниках29.
Нестандартные политики повторных попыток и интегрированная обработка ошибок: быстрое восстановление от временных сбоев28.
Примеры использования и области применения #
Примеры использования Restate #
Restate особенно подходит для следующих случаев:
Рабочие процессы и долгосрочные процессы: благодаря надежному исполнению можно управлять сложными рабочими процессами и долгосрочными процессами27.
Событийно-ориентированные приложения: обработка событий из источников, таких как Kafka, при сохранении состояния27.
Реализация паттерна Сага: возможность отмены предыдущих операций в случае необходимости возобновления транзакций27.
Состояние машина: возможность создания согласованной и масштабируемой машины состояний без баз данных27.
Примеры использования Hatchet #
Hatchet подходит для:
Справедливости запросов для генеративного ИИ: равное распределение запросов, чтобы не перегрузить систему занятими пользователями28.
Пакетной обработки документов и изображений: выполнение больших партий обработок и возможность возобновления обработки после сбоев28.
Оркестрации рабочих процессов для многомодальных систем: поддержка DAG-стили исполнения для многомодальных входов и выходов28.
Точности для обработки событий: автоматическая воспроизведение событий по внешним или внутренним системным событиям28.
Масштабируемость и производительность #
Масштабируемость и производительность Restate #
Restate предлагается в виде единого двоичного файла, что упрощает запуск и эксплуатацию, и разработан на Rust, что обеспечивает высокую эффективность использования ресурсов и устойчивость27. А с версии 1.2 добавлены функции высокой доступности и распределенной архитектуры для улучшения масштабируемости27.
Restate автоматически приостанавливает выполнение в случае долгих ожиданий, позволяя эффективно использовать вычислительные ресурсы, и может работать в различных средах, таких как FaaS, Kubernetes, серверы и контейнеры27.
Масштабируемость и производительность Hatchet #
Hatchet обеспечивает супернизкую задержку (среднее время запуска 25 мс) и высокопроизводительное планирование, обеспечивая баланс между функционалом в реальном времени и необходимой надежностью для критически важных задач29.
Система очередей на основе Postgres позволяет использовать функции SKIP LOCKED и актуальные релизы PostgreSQL, что подтверждает возможность горизонтального и вертикального масштабирования более 10k TPS28.
Опыты разработчиков и поддерживаемые среды #
Опыт разработчиков Restate #
Restate упрощает процесс разработки, позволяя писать код, словно это обычные функции и сервисы, избавляя разработчиков от необходимости беспокоиться о сложности распределенных систем27. Поддерживаются различные языки, включая Golang, Java, Kotlin, Typescript, Rust и Python27.
С версии 1.2 появилась графическая интерфейс для поддержки отладки распределенных приложений, а локальный сервер разработки улучшает долгосрочную среду тестирования и разработки27.
Опыт разработчиков Hatchet #
Hatchet предлагает открытые SDK для Python, Typescript и Go, поддерживая разработчиков в использовании подходящих инструментов28. Внедрены функции наблюдаемости, которые улучшают опыт разработки и отладки28.
Hatchet позволяет полностью отслеживать каждое исполнение, быстро выявляя проблемы, а также позволяет стримить логи и отслеживать задержки, частоту ошибок или пользовательские метрики29.
Сравнительный анализ и критерии выбора #
Restate и Hatchet имеют свои уникальные преимущества и оптимизированные случаи использования.
Когда подходит Restate #
Restate может быть более оптимальным выбором, если вам необходимо надежное исполнение с минимальными изменениями в коде, реализация сложных паттернов распределенных систем, таких как саги и машины состояний, а ресурсная эффективность и восстановление имеют значимость.
Когда подходит Hatchet #
Hatchet может быть более подходящим решением, если вам нужны очереди задач с справедливым распределением, важна видимость и мониторинг, необходим оптимизированный для современных случаев использования, таких как генеративный ИИ, а также надежная система очередей на базе Postgres.
Заключение #
Restate и Hatchet — это мощные решения с открытым исходным кодом для обработки надежных нагрузок в распределенных системах. Restate сосредоточен на надежном исполнении и реализации различных шаблонов распределенных систем, в то время как Hatchet делает акцент на очередях задач, справедливом распределении и наблюдаемости.
Каждый проект имеет свои уникальные преимущества и оптимизированные случаи использования, поэтому важно выбирать подходящее решение, основываясь на требованиях проекта, существующей инфраструктуре и квалификации команды разработчиков. Оба решения имеют общую цель — абстрагировать сложность распределенных систем и помочь разработчикам сосредоточиться на основной бизнес-логике.
-
https://github.com/temporalio ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://knative.dev/blog/articles/Building-Stateful-applications-with-Knative-and-Restate/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=41604042 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://appmaster.io/ko/news/inggestneun-300man-jageum-jiweon-baegendeu-weokeupeulrou-gaebaleul-mogeumhabnida ↩︎ ↩︎
-
https://swcho.github.io/blogs/2023-12-25-temporal-2 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=39643136 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://www.inngest.com/blog/open-source-event-driven-queue ↩︎
-
https://restate.dev ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://github.com/hatchet-dev/hatchet ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎