[Ищем бета тестировщиков] Отказоустойчивая оркестрация бизнес процессов на PHP (RoadRunner + Temporal)

Wolfy-J

Новичок
Привет!


Мы написали инструмент который считаем достаточно полезным PHP комьюнити. Это асинхронный PHP воркфлоу движок написаный для работы с API Temporal.io (MIT лицензированный Workflow движок с Event Sourcing используемый Uber, Coinbase, Hashicorp).


Если кратко, это такая штука которая позволяем вам относительно просто писать сложные бизнес процессы - платежы, корзины пользователя, подписки, обработку видео, логистику и тому подобное. Причем делать это масштабируемо и отказоусточиво.


Например можно сделать не один крон в системе, а по одному крону на пользователя, или заснуть на 30 дней:

PHP:
public function subscribe(string $userID)
{
    yield $this->account->sendWelcomeEmail($userID);

    try {
        $trialPeriod = true;
        while (true) {
            // Заснуть на 30 дней
            yield Workflow::timer(CarbonInterval::days(30));

            // списать сумму
            yield $this->account->chargeMonthlyFee($userID);

            if ($trialPeriod) {
                yield $this->account->sendEndOfTrialEmail($userID);
                $trialPeriod = false;
                continue;
            }

            yield $this->account->sendMonthlyChargeEmail($userID);
        }
    } catch (CanceledFailure $e) {
        // откат подписки
        yield Workflow::asyncDetached(
            function () use ($userID) {
                yield $this->account->processSubscriptionCancellation($userID);
                yield $this->account->sendSorryToSeeYouGoEmail($userID);
            }
        );
    }
}
Даже в случае падения воркера система восстановит стейт процесса используя историю действий. Из коробки - таймеры, корутины, асинхронные вызовы, авто-повторы и т.д.


Документация в процессе, но код стабилен.


Примеры можно найти тут: https://github.com/temporalio/samples-php

SDK: https://github.com/temporalio/sdk-php

Интеграция с RoadRunner: https://github.com/temporalio/roadrunner-temporal


-

Команда Спираль Скаут
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Мы написали инструмент который считаем достаточно полезным PHP комьюнити. Это асинхронный PHP фреймворк.
Например можно сделать не один крон в системе, а по одному крону на пользователя, или заснуть на 30 дней.
Документация в процессе

неужели на генераторах?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Мое скептическое отношение определяется словом tests
 

Wolfy-J

Новичок
Да на генераторах и промисах ReactPHP.

Что не так с тестами? Юнитовое покрытие мы со временем поднимем, но эдж кейсы покрыты и не однократно. В разработке помогали авторы Java SDK и авторы движка чтобы найти и закрыть слабые моменты. Вся «тяжёлая» работа делается в уже протестированном Go SDK и на сервере Temporal.

Плюс это бета. :)
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
стоит поменять заголовок на "не совсем отказоустойчивая"? )))

я не вижу ни тестов, ни докуменатации, ни примеров для аннонсированного функционала типа крона, ни по масштабируемости, ни по отказоустойчивости, отсюда и ссылка на тест саги в один ассерт
 

Wolfy-J

Новичок
Вы смотрите на конкретный SDK для PHP. Тесты покрывают конкретно эдж кейсы работы SDK, дублировать тесты на сам движок нет никакого смысла. Сам SDK достаточно ограничен. Крон работает аналогично continue as new, тестировать его с точки зрения SDK не имеет смысла так как крон, гор. масштабируемость, ретраи истории это задача Go SDK и самого сервера.

Если вам интересно то вот существующий набор тестов на который мы опираемся:

Документацию пишем. Для других SDK документация доступна тут - https://docs.temporal.io/docs/overview/

Пример кода крона: https://github.com/temporalio/samples-php/blob/master/app/src/Cron/ExecuteCommand.php
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Последнее редактирование:

Wolfy-J

Новичок
Статичный фасад был сделан намеренно, это не ошибка. Под капотом контекст передается явно. Примеры достаточно свежие, комментарии добавим (в части примеров комментарии есть - https://github.com/temporalio/samples-php/blob/master/app/src/SimpleActivity/GreetingWorkflow.php https://github.com/temporalio/samples-php/blob/master/app/worker.php), но сейчас приоритет закончить документацию.

Разбор архитектуры и модели работы:
https://www.youtube.com/watch?v=llmsBGKOuWI

Этот SDK позволяет детерминированно описывать распределенные транзакции и бизнес процессы без обычной инфраструктурной обвязки и без классического для воркфлоу движков DSL, кратко что это такое можно глянуть тут https://temporal.io/#explain-temporal

Мы не авторы Temporal, его написали инженеры Amazon и Uber. Мы написали RoadRunner и занялись интеграцией.

Мы постоянно работаем Kubernetes. Helm чарты тут: https://github.com/temporalio/helm-charts

В случае запуска сложного процесса на k8s job вам все равно придется писать координационную логику и таймауты. Темпорал это суперсет (балансировка и очереди уже включены) и он это делает самостоятельно. Плюс полный аудит лог выполнения, возможность писать динамические процессы (что не дают обычные DAG движки), построение каскадных трейсов ошибок и возможность запроса состояния стейта.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
есть temporal.io, у него нет поддержки PHP, OK, ребятя его пилят, ладно

а зачем нужны пустые финальные классы с магическими методами? как разобраться в коде без phpdoc?
как его запускать? как разворачивать? что с ним, вообще, делать?

когда я публикую статью - для каждого тезиса пишу пример кода со ссылкой на коммит на гитхабе, думаю над структурой документа, а это - студенческая поделка
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
слуш, вот как мне между митингами запустить это чудо инженерной мысли? что конкретно надо сделать?
я открываю код - там пустой final класс с магическими методами, открываю другой - нет phpdoc, все - картина Репина

пишут "сага" - пусто, "крон" - пусто, дальше что?

"относительно просто писать платежЫ" - вопросов больше не имею
 
Последнее редактирование:

Wolfy-J

Новичок
Привет, в README описан процесс запуска и даны описания примеров. В том числе по сагам и крону. Пожалуйста скажите чего не хватает, добавим.

Документацию и информацию по деплою мы предоставим. Само собой из беты без нее мы не выйдем.

Было ожидание того что описания в репозитории с примерами достаточно для «поиграться».

 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Wolfy-J прости за резкость выше, сейчас отредактирую фразы

я правильно понимаю, что сначала надо собрать и отдебажить свой образ php с расширением grpc , потом собрать php с roadrunner, отладить и запустить в контейнере, потом изнутри контейнера руками установить зависимости composer install?
 

Wolfy-J

Новичок
@grigori достаточно установить grpc. Зависимости и RoadRunner можно ставить сразу на хост систему (там есть команда на скачку последней версии сервера).

Чуть позже добавим готовый Docker image, сейчас есть полуфабрикат - https://github.com/temporalio/samples-php/blob/master/Dockerfile

> @Wolfy-J прости за резкость выше, сейчас отредактирую фразы

Я понимаю что возможно информации недостаточно. Но у нас была цель дать доступ к бете как можно раньше, чтобы найти команды которым это интересно (т.е. сам temporal.io). Полная инструкция по настройке и написанию воркфлоу занимает приличное время.

Пока я могу только рекомендовать посмотреть примеры и документацию на Java, Go: https://docs.temporal.io/docs/sdks-introduction

Про пустой статический фасад я расскажу отдельно, я понимаю что это, в общем, антипаттерн, но его смысл всегда выдавать корректный контекст независимо от активной корутины (т.е. снижение нагрузки на разработчика). Мы реализовывали эту часть согласно Java SDK.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Wolfy-J сфера применения - enterprise, не CMS. Объем работы здесь подразумевается очень большой. И бюджеты соответствующие.
В текущем виде, к сожалению, эта библиотека больше похожа на плагин для wordpress.
 
Сверху