LINUX.ORG.RU

Архитектура системы обработки заказов

 ,


0

2

Имеется система, аналогия которой это обработка заказов в магазине или обработка запросов в система типа jira. Некоторыми образами в систему попадает сущность, пусть будет «заказ». Объём - тысячи в день. Далее эта сущность проходит через несколько статусов. Сейчас - чуть больше 10, но число их потихоньку растёт. К примеру после того, как сущность создана, делается запрос в другую систему. Если запрос вернул данные, то данные присоединяются к сущности и переходит в следующий статус. Далее идёт запрос в другой сервис и с сущностью работают там. Там свои статусы. Какие-то переходы это просто запрос в сервис, какие-то переходы это ожидание действий пользователя (может быть до месяца). Переходы могут добавлять данные к сущности, как в примере выше. В конце концов сущность либо архивируется с успехом или по таймауту.

Всё, что выше, это абстрактное описание того, как это всё работает.

Сейчас это примерно 3 сервиса, у каждого своя база. Ну и внешние сервисы, их тоже несколько. Часть переходов между статусов это скедулеры, запускаются раз в полминуты, или в минуту, или в 5 минут. Часть переходов это непосредственно запросы от пользователя.

Некоторые переходы важно повторять. К примеру если сервис лежит, нужно повторять запросы, причём с задержкой желательно по алгоритму, чтобы не дудосить.

Что сейчас плохо:

  1. У всего этого нет никакой формы. По сути система выросла исторически, из простой и понятной в некоего монстра. Алгоритмы перехода между статусами мало кто понимает.

  2. Всякие повторы и тд реализуются на месте с переменным успехом. Где-то вообще не реализуются. Типа лежит сервис отправки смс, и фиг с ним, не очень-то и нужно. Где-то долбит раз в минуту, в итоге скапливается несколько десятков тысяч заказов, которые из-за чего-то не могут отправиться и система начинает тормозить, пока кто-то не придёт и не разберётся. Где-то сделано по уму, с экспоненциальной задержкой. Хочется, чтобы везде было по уму.

  3. Логи. Все логи ведутся ну тупо в лог файлах. Текущее состояние можно посмотреть в базе, истории состояний нет. Проблемы решаются очень долго - надо долго грепать логи (а их очень много, гигабайты в день), копаться в базе, курить сорсы. В общем случае в логах, базах и сорсах нескольких сервисов. От системы хочется, чтобы была возможность найти сущность, посмотреть её историю, в идеале вообще посмотреть - какие запросы делались и какие ответы получались в определённые моменты времени. В общем чтобы суппорт писал «по юзеру иванов не отрабатывается заказ», ты шёл в дашборд, находил «user.name=иванов» его заказ, сразу видел, что он в таком-то статусе, сделал 3 попытки на такой-то сервис, получил такие-то ответы. В общем как-то так.

  4. Скорость работы. Из-за того, что скедулеры отрабатывают не моментально и не раз в секунду, а в среднем раз в минуту, каждая смена статуса занимает до минуты, в итоге то, что может сделаться за долю секунды, занимает несколько минут.

  5. В целом есть ощущение, что такие системы должны строиться по типовой архитектуре.

Если бы я это делал, я бы сделал как-то так:

  • Есть сущность
  • У неё есть статус
  • К сущности прикрепляются произвольные данные по ключ-значение
  • Частью статуса может служить выражение вида ключ == значение и тд. Ну чтобы не делать комбинаторный взрыв из статусов. Хотя тут спорный момент, может это и не надо.
  • Куча сервисов, которые обрабатывают изменения статусов.
  • Сервис триггерится либо по изменению статуса, либо по внешнему вызову. С внешним вызовом надо подумать, пока чёткого понимания нет.

При вызове сервиса можно автоматом делать повторы, причём с задержкой нужной, логгирование и тд.

Но в целом я предполагаю, что это велосипед и делать описанное выше не нужно, а нужно понять, что мне нужно.

У меня давным давно был опыт работы с Java фреймворком, который работал с BPMN. Честно говоря я не смог вспомнить его название, наверное это был jbpm. Кажется, что этот фреймворк решал похожую задачу. Там в эклипсе рисовали workflow эдакой блок-схемой, в каждом узле прописывали логику работы. Честно говоря опыт был крайне отрицательный, система была максимально геморройна для работы с ней. Но допускаю, что это была проблема конкретной реализации или старой версии. Поэтому первый кандидат, который я рассматриваю, это фреймворки с BPMN подходом.

Сразу скажу, что нужды рисовать блок-схемы в этом проекте нет. Разрабатывают программисты, по своему опыту скажу, что мне от этих упрощалок одно неудобство. Любой нетривиальный workflow скорей всего превратится в графическое мессиво.

Попытавшись поискать информацию по этой теме я часто встреваю упоминание некоего apache airflow и очень похожих на него продуктов. У меня всё же ощущение, что это похожее, но не то.

Также очень интригующий проект это temporal.io. Я его пока не осилил, он кажется очень непростым и нужно найти время, чтобы понять, что это такое. Но буду благодарен, если кто-то уже его использовал и скажет - то ли это?

Видел, как для похожей задачи применяли n8n. Там работали не программисты, это nocode инструмент. Мне не понравился, но концептуально вроде это тоже решает данную задачу.

Не хочется сложных решений, т.к. команда небольшая и не супер-профессиональная. Хочется решение простое, понятное, но в то же время решающее насущные проблемы.

★★★★

Последнее исправление: vbr (всего исправлений: 4)

в общих чертах.

речь о конечном автомате

это дело нужно описать в виде диаграммы состояний и\или таблицы переходов.

далее, чтобы не растекаться по древу а получить некий практический выхлоп здесь и сейчас, следует прикрутить логи к кликхаузу, чтобы получить аналитику и представление о том что вообще происходит.

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

olelookoe ★★★
()

Есть такая штука как Drools, это специальный движок для правил перехода между статусами, описываемыми специальным языком.

Правило на нем выглядит вот так:

rule "Underage"
  when
    Applicant( applicantName : name, age < 21 )
    $application : LoanApplication( applicant == applicantName )
  then
    $application.setApproved( false );
    $application.setExplanation( "Underage" );
    update($application);
end

Такой себе упрощенный BPM, существующий ради задачи переключения статусов.

Вот примеры встраивания и использования. Но сложная штука, требует подготовки.

alex0x08 ★★★
()

Касаемо бекграунд воркеров - нормальные делаются на AMQP + воркеры. Те RabbitMQ, Kafka, Storm + консьюмеры с бизнес логикой. Нюансы тут в деплое и управлении этой средой (прод, стейдж, дев стенды, на ровном месте набирается пачка сервисов про которые стоит помнить при деплоях, так что отлаженный CI/CD тут строго обязателен становится).

По реализациям для управления воркерами - я использу Celery. Работает поверх RabbitMQ/Redis и решает задачу по организации выполнения большого кол-ва бекграунд тасков. Юзаю на Python + Django - там все максимально прозрачно получается.

Для организации воркфлоу для него есть какие-то морды, но сам не юзал. Вот пример: https://ovh.github.io/celery-director/ Еще есть веб морда flower для мониторинга его состояния.

По реализации на беке - на моей практике, когда есть бизнес сущности и есть прохождение по некому флоу, то типовой работающий паттерн это создание сущности TaskSomething в базе, который обновляется воркерами и указывает на то, что происходит в воркерах. Это если нужно гарантировать стейт и возможность сделать ретрай на любом шаге (даже если у нас есть умный сервис вокруг). На тысячах тасков в день проблем с таким подходом не предвижу. Опять же, смотри в итоге какой инструмент есть под твой стек - там это может быть из коробки.

Требуются гарантии - делаешь validate тасков в базе раз в N времени. Если видишь проблемы, то включаешь логику по их обработке (откатить изменения, отменить транзакции, кинуть оповещение в людей, что полимеры просираются и тд).

Какой у вас там стек я не знаю, но я бы просто поискал в гугле stacktitle celery analog или stacktitle celery. Задачка в целом типовая, но для разных стеков могут быть разные типовые инструменты ее решения.

PS Для своих проектов, на будущее, посматриваю в сторону n8n и аналогов. Тк, в основном, задачи заключаются в отправке письма, смс, сообщения в месседжер, а это уже тысячи раз решенная задача.

Но тут нужно смотреть на специфику, нагрузку, кодовую базу имеющуюся.

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 2)

В целом есть ощущение, что такие системы должны строиться по типовой архитектуре

Вот. Всё ждал подобной фразы. Охренительное число коммерсов имеют плюс-минус похожие задачи, но все решения, которые в ответ предлагает рынок — это убогие переусложненные Jira, SAP, и подражающий им софт.

Ты правильно указал главную проблему в том, что

От системы хочется, чтобы была возможность найти сущность, посмотреть её историю, в идеале вообще посмотреть - какие запросы делались и какие ответы получались в определённые моменты времени

Но для подобного плана задач нет не то что готовых решений — даже полуфабрикатов, даже методики разработки UI для анализа очень сложных сущностей нету. Помнится, не так давно видел инструмент от бигдатовцев, который визуализировал результаты анализа в виде паутинки галактик, и это было прямо вау, ни у кого такого нет. Но по сути создание такого инструмента не должно было быть сверхъестественной задачей с огромным бюджетом.

На текущий момент основной ответ от индустрии на твою задачу — лепите что попало теми инструментами, которые под рукой, дальше тестируйте до дыр, но никакой гарантии вам никто не даст, а инструменты анализа/отладки у вас будут только те, которые вы сами напишете (как сделали эти бигдатовцы).

byko3y ★★★★
()
Ответ на: комментарий от Norgat

Касаемо бекграунд воркеров - нормальные делаются на AMQP + воркеры. Те RabbitMQ, Kafka, Storm + консьюмеры с бизнес логикой
По реализациям для управления воркерами - я использу Celery. Работает поверх RabbitMQ/Redis и решает задачу по организации выполнения большого кол-ва бекграунд тасков. Юзаю на Python + Django - там все максимально прозрачно получается

Максимально прозрачно оно получается только если можно в любой момент сделать снимок системы и пожагово пройтись по логике, всё остальное ­— езда на одноколесном велосипеде и гадание на гуще. Statefull очереди в питоне — это просто-напросто workaround из-за отсутствия адекватной многозадачности с обменом родными данными в самом питоне из коробки, до уровня Erlang с единым интерфейсом для локальных и удаленных подзадач этим костылям идти как до киева шойгу. По этой причине я в свое время начал делать PSO, но по итогу выяснил, что для достижения адекватного уровня поддержки фич нужно половину питоньих библиотек дорабатывать.

byko3y ★★★★
()
Ответ на: комментарий от Shushundr

The Web Services Business Process Execution Language (WS-BPEL), commonly known as BPEL (Business Process Execution Language), is an OASIS[1] standard executable language for specifying actions within business processes with web services

Почему каждый стандарт OASIS, на который я натыкаюсь, представляет собой настолько всратую неадекватную дичь? У них удивительным образом получается выдавать стандарты, которые все заинтересованные стороны немедленно берут в реализацию, после чего больше никто про эти технологии ничего не слышит за пределами пары специализированных софтин авторства тех самых заинтересованных сторон. У них еще почему-то бзик на XML, хотя уже давно очевидно, что это формат несостоятелен, поскольку его тяжело читать как людям, так и машинам (не существует способов ускорить его парсинг из-за последовательности/рекуррентности синтаксиса XML).

BPEL — это «идея», но не реализация. Реализация есть у Оракла за миллион денег, которых у автора исходного сообщения нету.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Реализация есть у Оракла

https://www.cnews.ru/news/top/2023-09-06_razvityj_gorod-millionnik

Власти британского города Бирмингем объявили городской совет банкротом. В бюджете города образовалась огромная дыра, в том числе из-за гигантских расходов на перевод ИТ-экосистемы совета с ERP-системы за авторством SAP на аналогичное решение Oracle. Переход затянулся на годы, а его смета за это время выросла в пять раз и достигла 100 млн фунтов стерлингов. При этом решение Oracle не имеет значительной части функций, необходимых властям города и присутствующих в ERP SAP.

MoldAndLimeHoney
()
Ответ на: комментарий от MoldAndLimeHoney

перевод ИТ-экосистемы совета с ERP-системы за авторством SAP на аналогичное решение Oracle

По этому поводу есть бессмертные слова классика: Аксиома Эскобара

Причем, точно так же люди вляпываются в оракл и не могут от него уйти. Или вляпываются в кобол:
https://medium.com/@alxdubov/the-failure-of-the-banking-system-to-migrate-fro...

Commonwealth Bank of Australia, for instance, replaced its core banking platform in 2012 with the help of Accenture and software company SAP SE. The job ultimately took five years and cost more than 1 billion Australian dollars ($749.9 million).

Более того, ситуация, когда внедряли SAP с изначальным бюджетом в $100 млн, а в итоге вышло хер с маслом $300 млн — не единичны.

С очень большой вероятностью городскому совету Бирмингема «значительная часть функций» на самом деле не нужна, но что я могу понимать в распиле бюджетных денег? Они же не отменяют миграцию на оракл да? Они просят дать им больше денег. В этой всей истории Оракл больше всех доволен, называет этот проект одним из величайших успехов — еще бы, распилить 100 млн фунтов на ровном месте, такой-то успех, ага.

Я сомневаюсь, что автора этого треда интересуют распилы такого масштаба. Он спрашивал про простое рабочее решение — я отвечал про простое рабочее решение. BPEL — это сложное дорогое решение, которое в плане сроков-надежности не имеет никаких преимуещств над простыми альтернативами.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Охренительное число коммерсов имеют плюс-минус похожие задачи, но все решения, которые в ответ предлагает рынок — это убогие переусложненные Jira, SAP, и подражающий им софт.

Названия крупных корпораций, топовых продуктов и при этом пренебрежительное отношение к бизнесменам и бизнесу - сразу видно «мегаэксперта» по всем вопросам.

Но для подобного плана задач нет не то что готовых решений

Юмор в том что ТС и его задачи это целевая аудитория для любых языков программирования общего назначения, любых фреймворков и любых решений автоматизации.

Его задача это та самая база, ради автоматизации которой ИТ вообще создавался.

alex0x08 ★★★
()
Ответ на: комментарий от byko3y

Более того, ситуация, когда внедряли SAP с изначальным бюджетом в $100 млн, а в итоге вышло хер с маслом $300 млн — не единичны.

Ох уж эти сказочники.

Вот начинается движение в сторону автоматизации (вендор тут не важен) - подписывается первый договор о намерениях и звучит некая первая абстрактная цифра, взятая из опыта предыдущих внедрений.

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

И звучит уже другая цифра, тоже примерная.

Дальше начинается сама работа, которая может идти годами - не из-за тупых исполнителей а из-за масштаба задачи.

Видя что есть «компетентые люди которые работают и делают дело» - руководство со стороны заказчика начинает докидывать новые и новые задачи, с чего бюджет всего проекта растет еще раз.

Финансовые потоки потому и «потоки», что это не фиксированная цена в шекелях а натуральная река, которая течет, временами пересыхая либо наоборот разливаясь.

И если что стоимось большой автоматизации считается в % от оборота компании, это даже сразу не какая-то конкретная цифра, поэтому все эти 100 и 300 млн скорее всего либо просто выдумка либо взяты «по итогам», из конечной отчетности.

alex0x08 ★★★
()
Ответ на: комментарий от vbr

Немного ознакомился с temporal.io, кажется идеально подходящим

Вы меня заинтриговали.

https://news.ycombinator.com/item?id=25614487

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

byko3y ★★★★
()
Ответ на: комментарий от vbr

Немного ознакомился с temporal.io

Я тоже ознакомился и вот какие выводы:

  1. нужно минимум три отдельных сервера чтобы начать этим пользоваться: клиент, сам Temporal сервер и еще отдельно «Workflow Execution». Даже если это физически один сервер, это три разных приложения. Сразу, с ходу.

  2. Cам Temporal ни за что не отвечает (поэтому он такой надежный да) Вот тут очень интересный текст про это под каждым блоком: https://temporal.io/how-temporal-works но он нарисован на картинке, поэтому не могу вставить.

  3. Temportal это чисто технический движок, там нет никаких сущностей вообще, поэтому все что касается бизнесовой начинки - отсутствует совсем.

Вообщем не знаю, терзают смутные сомнения в целесообразности такого решения.

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

нужно минимум три отдельных сервера чтобы начать этим пользоваться: клиент, сам Temporal сервер и еще отдельно «Workflow Execution». Даже если это физически один сервер, это три разных приложения. Сразу, с ходу.

Ну если ты число приложений считаешь, то temporal состоит из кучки компонентов и там наверное под десяток насчитать можно. Ещё постгрес и эластик туда же. С тремя репликами, ага.

Cам Temporal ни за что не отвечает (поэтому он такой надежный да) Вот тут очень интересный текст про это под каждым блоком: https://temporal.io/how-temporal-works но он нарисован на картинке, поэтому не могу вставить.

Не очень понял этот пункт.

Temportal это чисто технический движок, там нет никаких сущностей вообще, поэтому все что касается бизнесовой начинки - отсутствует совсем.

Имеешь в виду - нет готовых кирпичиков вроде «сделать хттп запрос», «положить файл в с3»? Да, такого вроде нет.

Вообщем не знаю, терзают смутные сомнения в целесообразности такого решения.

Пока видел только положительные отзывы от тех, кто пробовал.

Меня в основном беспокоит версионирование. Это кажется самым главным источником боли. Когда у нас workflow выполняется месяц, а за этот месяц выкатили пять новых версий, там будет куча if-ов на версии, в общем полная лапша, нужно будет постоянно смотреть и удалять устаревшие версии. В целом эта проблема, конечно, присуща любой системе и тут видно, что они эту проблему осознают и делают всё, чтобы боли было меньше, ну посмотрим.

vbr ★★★★
() автор топика
Ответ на: комментарий от byko3y

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

Я не очень понял про алгоритмы, но как оно работает - я понял. Вкратце распишу, идея интересная и нетривиальная.

  1. Есть функции workflow. Пишется на любом (из поддерживаемых) ЯП, просто кодом. Пример workflow это «обработать заказ», что складывается из «обновить БД заказов», «сделать запрос на склад», «если на складе нет товара то уведомить менеджера и подождать его ответа», «если на складе есть товар то вызвать эндпоинт чтобы этот товар отправили на выдачу» и тд. workflow концептуально может работать сколько угодно времени, хоть секунду, хоть сто лет. По сути это описание бизнес-процесса.

  2. Есть функции activity. Тоже пишутся на любом ЯП. С ними в принципе вообще всё просто, функция и функция, параметры приняли, результат отдали. К примеру «сделать хттп запрос», «обновить статус в базе», «положить файл в с3». Они обычно работают относительно быстро.

Параметры и возвращаемое значение там и там должны быть сериализуемы, они их хранят в базе.

Вся суть в функциях workflow. Эти функции с «внешним миром» общаются исключительно через temporal api (у них есть библиотеки для каждого языка). Причём внешним миром является даже запрос текущей даты/времени и рандомного числа.

Каждый такой вызов уходит на сервер. Сервер записывает факт этого вызова, его параметры и возвращаемый результат. Ну и возвращает результат. Это в первый раз.

Потом, к примеру, наш workflow «останавливается» на неделю, пока менеджер не тыкнет кнопочку. Worker, который выполнял workflow, конечно не будет неделю держать запущенным тред, да и вообще он сам может давно завершиться по любой причине. Поэтому через неделю функция workflow запускается заново. Но сервер знает, на каком этапе эта функция «уснула» в прошлый раз. И когда функция спрашивает текущую дату/время или делает хттп запрос, то сервер отвечает ранее сохранённым значением. Т.е. функция быстро доходит до актуального состояния. Ну и продолжает выполнение с этого момента. Все существенные действия workflow фунция должна выполнять через вызов activity.

Иными словами, концептуально, workflow функция не останавливается, а работает один раз, от начала до конца, сколько угодно времени, вне зависимости от того, что серверы «под ней сгорают». Ну а физически это реализуется повторными запусками этой функции.

А activity функции в целом никаких ограничений не имеют. Ну разве что идемпотентность желательна. Но не обязательна, как я понял. При вызове activity настраиваются политики retry-ев. Если activity не сработало по какой-то причине (вернуло ошибку или сервер, где она была запущена, сгорел), то temporal её запустит повторно, ну или вернёт ошибку в workflow, если повторы уже невозможны, а там бизнес логика уже должна решать, что делать в такой ситуации.

Поэтому ограничения на workflow функцию есть. Ей нельзя пользоваться API с недетерминированным результатом (к примеру перебирать hashmap в неизвестном порядке), ей нельзя спрашивать внешний мир кроме как через API темпорала или через активити. А также нужно очень вдумчиво подходить к изменениям этой функции, т.к. если у нас есть запущенные workflow, то они должны быть совместимы с изменённой функцией.

Вот как-то так. А надёжность достигается, как я понимаю, по сути перекладыванием её на программиста. workflow функции должны быть детерминированы, activity функции должны быть идемпотенты. А temporal просто следует относительно простому алгоритму.

Поэтому такую систему, по большому счёту, можно на коленке за неделю сваять. Ну в виде proof of concept. Ценность именно temporal в том, что это уже третье поколение системы такого рода, в том, что там есть SDK для кучки языков, в том, что там есть красивый дэшбоард, где можно систему обозревать и смотреть, где какие ошибки, ну и там есть ещё некоторые фичи, но они уже не так критичны и концептуальны.

То бишь под temporal.io в первую очередь я понимаю класс систем, построенных на этой идее. Это Amazon SWF (первая система), Cadence (повтор этой системы в Uber), ну и Temporal, который сделали те, кто делал Cadence и решили из него свой маленький стартап организовать. А во вторую очередь я уже понимаю конкретно этот проект, т.к. в целом он выглядит более чем готовым к продакшну.

vbr ★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 4)
Ответ на: комментарий от alex0x08

Drools

Сразу скажу ТСу. vbr, если жизнь и рассудок дороги тебе, держись подальше от их ИДЕ и прочих тулзей.

Я когда-то писал плагин для мавена чтобы встроить сборку рулов в общий процесс и хранить всё в гите, но он помер вместе с гуглокодом.

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

ya-betmen ★★★★★
()
Ответ на: комментарий от Anoxemian

Я не в России и с российскими компаниями пока не работал, вряд ли про проект, где я работаю, кто-то слышал, он очень сильно местечковый и маленький.

vbr ★★★★
() автор топика
Ответ на: комментарий от vbr

Ну если ты число приложений считаешь, то temporal состоит из кучки компонентов и там наверное под десяток насчитать можно. Ещё постгрес и эластик туда же. С тремя репликами, ага.

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

Стоимость владения сразу подскакивает в этом месте.

https://temporal.io/how-temporal-works но он нарисован на картинке, поэтому не могу вставить.

Не очень понял этот пункт.

Это у них такая презентация, переверстанная в html «as-is», прочитай внимательно текст справа от картинок - там рассказываются удивительные вещи.

Пока видел только положительные отзывы от тех, кто пробовал.

Дело не в отзывах а в применимости, из того что я вижу это все слишком уж low-level, для каких-то технических задач. Грубо говоря когда есть 1000 скриптов на bash, которые составляют отчеты и делают выборки - вот чтобы все это как-то красиво упаковать.

Полагаю что компаний с внутренними бизнес-процессами на скриптах сильно больше чем на формализованном BPM.

Меня в основном беспокоит версионирование. Это кажется самым главным источником боли. Когда у нас workflow выполняется месяц, а за этот месяц выкатили пять новых версий,

Тут не может быть простых вариантов, увы.

Подход из BPM где каждый запущенный процесс изолируется целиком на время выполнения (те та версия которая была запущена и доходит до конца, даже если сам процесс был изменен) - далеко не всегда адекватен задаче.

Представь что это процесс одобрения кредита ( т.н «кредитный конвеер») , очевидно что при его изменении придется обновлять и все запущенные процессы одобрения кредита.

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

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

Стоимость владения сразу подскакивает в этом месте.

Тут не спорю, мне он тоже показался совсем не легковесным. Я даже немножко обдумываю вариант реализации велосипеда на основе этой идеи. Хотя вряд ли буду делать.

vbr ★★★★
() автор топика
Ответ на: комментарий от vbr

В любом случае надо исходить из детальной постановки, я например пришел к тому что при подобных твоим вводных достаточно СУБД и поля «статус» у записи.

А все переходы делаются в фоне и атомарно - т.е. переключить статус одного на другой может только кто-то один.

Поэтому процесса как такового больше нет, есть лишь набор записей со статусами и фоновые операции, запускающиеся по определенному статусу.

alex0x08 ★★★
()
Ответ на: комментарий от vbr

Концептуально эти workflow выглядят как сопрограммы / файберы, реализованные на языке, их явно не поддерживающем. Там тоже на каждом запросе внешнего мира функция (которая там называется task) останавливается, уходит в обслуживающий код, который затем её перезапускает и на все предыдущие yield возвращает ранее полученные значения. Соответственно, автоматически появляются требования к идемпотентности кода workflow / task.

static_lab ★★★★★
()
Ответ на: комментарий от alex0x08

Названия крупных корпораций, топовых продуктов и при этом пренебрежительное отношение к бизнесменам и бизнесу - сразу видно «мегаэксперта» по всем вопросам

Смотря что ты назваешь «бизнесмен и бизнес». Вот в МММ сидели серьезные люди, работали, не то что мы сейчас сидим непотребством занимаемся. Мавроди за наши грехи на крест пошел, а вот Дениска Пушилин нынче губернатор.

Юмор в том что ТС и его задачи это целевая аудитория для любых языков программирования общего назначения, любых фреймворков и любых решений автоматизации

Да, при условии отсутствия отказоустойчивости и распределенности, когда твоя Тьюринг-машина может тьюринг-машинить с атомарными мгновенными операциями на бесконечной ленте. На заводе в моем родном городе для относительно большого завода мои знакомые делали автоматизацию в виде чисто клиент-серверного решения с ораклом в центре. Нет центральной базы — нет автоматизации. Тот проект, в котором я работал, был из той же оперы с набором центральных серваков на мускуле с синхронной репликацией (как правило для on-premises применялся один сервер).

На самом деле, тотальная централизация — это вообще бзик современного IT, кто бы какие песни не пел об обратном. Когда ты централизуешься, то возникают проблемы с масштабируемостью — тут из-за угла вылазят оракл с сапом и ласково предлагают сервера с терабайтом оперативной памяти и проверенными централизованными БД для работы на них.

byko3y ★★★★
()
Ответ на: комментарий от alex0x08

Вот начинается движение в сторону автоматизации (вендор тут не важен) - подписывается первый договор о намерениях и звучит некая первая абстрактная цифра, взятая из опыта предыдущих внедрений

Вендор тут важен, потому что в случае SAP звучат серенады о том, как SAP идеально решает задачи именно этой компании, цифра называется минимальная, чтобы лох ценный клиент не соскочил. Ты думаешь, Lidl бы согласился на внедрение даже за $500 млн? (при том, что на самом деле нужно еще больше)

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

Я даже больше скажу — это ВСЕГДА есть, это 100% ожидаемая ситуация, в декабре внезапно наступает зима, в июне — лето... но может быть и в мае. Неформализуемые процессы — это ориентировочно 40% вообще всех процессов в компании, и проблема SAP или Jira заключается в том, что их НЕВОЗМОЖНО адаптировать к этим процессам, не переписывая с нуля. Кто-то попросил кого-то заменить, а сам взял на пять часов отгул, где-то пришла половина товара, а вторая придет позже, где-то калечные терминалы, а у кого-то учет идет не по себестоимости, а по цене продажи (как у Lidl), и прочее, прочее, прочее.

Лично меня больше всего выбешивала, конечно же, Jira, когда от тебя требуют процент выполнения стадии, чтобы построить красивый график в человекочасах. Кодинг — это не разгрузка угля, в нем никогда нельзя выполнить задачу до конца, и по итогу выходит, что я вынужден подгонять отчетность в Jira для рисования красивого графика, а к реальной работе это отношения не имеет. В более формализуемых сферах проблема не так выражена, но она все равно есть. Слава яйцам, что наш заказчик в итоге сообразил, что у нас получаются хуже всех рисовать графики, но лучше всех работать.

А есть совершенно отбитый менеджмент, который даже не пытается понять реальное положение дел, формальные доклады для него являются единственным окном в мир. И в том числе это основная аудитория Jira/SAP, которой продажники вылизывают очко со словами «да вы лучший руководитель в мире, мы раскроем ваш талант во всей красе». Чухаться такой руководитель начинает только когда дело пахнет жаренным, компания на грани банкротства и надо искать крайних.

Видя что есть «компетентые люди которые работают и делают дело» - руководство со стороны заказчика начинает докидывать новые и новые задачи, с чего бюджет всего проекта растет еще раз

По мере выявления всё новых и новых плохо формализуемых процессов выясняется, что готовых инструментов для решения этих задач нет, Jira и SAP сделали ригидное узкоспециализированное решение грубой силой (человекочасами разработчиков), и теперь чтобы его расширить нужно еще потратить сравнимое число ресурсов (сотни миллионов долларов в случае Lidl). И ладно если эта доработка опциональна, но в случае Lidl эта доработка была обязательна, потому внедрение провалилось.

И если что стоимось большой автоматизации считается в % от оборота компании, это даже сразу не какая-то конкретная цифра, поэтому все эти 100 и 300 млн скорее всего либо просто выдумка либо взяты «по итогам», из конечной отчетности

Насколько мне известно, это деньги, которые компания реально переводит SAP, это не какие-то там воображаемые показатели. Как они относятся к обороту компании меня, если честно, не особо волнует.

byko3y ★★★★
()
Ответ на: комментарий от vbr

Ну если ты число приложений считаешь, то temporal состоит из кучки компонентов и там наверное под десяток насчитать можно. Ещё постгрес и эластик туда же. С тремя репликами, ага

Меня так ВЫБЕШИВАЕТ эта современная культура разработки, когда системы уже измеряются не фичами, а приложениями. Кубер, этцд, монга, нжинкс, редис, эластик, битс, логстэш, кибана — это называется «мы сделали hello world на вебскейле». Дальше выбор идет «кролик или кафка?».

Меня в основном беспокоит версионирование. Это кажется самым главным источником боли. Когда у нас workflow выполняется месяц, а за этот месяц выкатили пять новых версий, там будет куча if-ов на версии, в общем полная лапша, нужно будет постоянно смотреть и удалять устаревшие версии

А я задавал более общий вопрос про координацию между несколькими процессами. Смена схемы у одних процессов во время работы других — это один из вариантов. Это проблема для вообще всего асинхронного/многопоточного/многозадачного/распределенного кода: машина Тьюринга основывается на доступности всего состояния здесь и сейчас, его атомарное мгновенное изменение, но эти условия не получится выполнить за пределами микрокомпьютерного манямирка — и возникает вопрос "как алгоритм адаптируется к смене контекста извне?".

Эта основная дыра в популярной методологии кодинга, я не знаю адекватного решения среди массово используемых. В лучшем случае это будет какой-нибудь специализированный костыль, которым подопрут наиболее вопиющую проблему.

byko3y ★★★★
()
Ответ на: комментарий от alex0x08

Меня в основном беспокоит версионирование. Это кажется самым главным источником боли. Когда у нас workflow выполняется месяц, а за этот месяц выкатили пять новых версий,

Тут не может быть простых вариантов, увы

У эффективной файловой системы тоже не бывает простых вариантов, но бывают ГОТОВЫЕ РЕШЕНИЯ, которые скрывают большую часть сложности. Так вот дело в том, что готовых решений нет, но ты подаешь это как «быть не может, слишком сложная задача».

Подход из BPM где каждый запущенный процесс изолируется целиком на время выполнения (те та версия которая была запущена и доходит до конца, даже если сам процесс был изменен) - далеко не всегда адекватен задаче

Ага, товар заказан у поставщика, должен быть доставлен на склад, а со склада — потребителю, но в процессе выполнения выясняется, что склад расформировали. Еще раз повторю тезис из
Архитектура системы обработки заказов (комментарий)
Тьюринг машина — это красивая абстракция, которая совершенно несовместима с задачами из реального мира, где есть больше одной ленты и больше одного исполнителя.

Меня на этом фоне выбешивает утырок из статьи по вышеприведенной ссылке, который рассказывал про красоту и элегантность конечных автоматов («понятные с первого взгляда» примеры прилагаются):
https://nullprogram.com/blog/2020/12/31/ — State machines are wonderful tools

byko3y ★★★★
()
Ответ на: комментарий от static_lab

Там тоже на каждом запросе внешнего мира функция (которая там называется task) останавливается, уходит в обслуживающий код, который затем её перезапускает и на все предыдущие yield возвращает ранее полученные значения

Я в PSO сталкивался с подобной хренью. Отказ, из-за которого программа не может продолжать работать В ТЕКУЩИЙ МОМЕНТ — это вообще типовая история в реальном мире. Даже рантаймы с поддержкой зеленых потоков такого не умеют — только в отдельных СУБД есть поддержка атомарных сложных транзакций.

В остальном отсталая методология программирования говорит, что все операции выполняются мгновенно и всегда успешно, если что-то идет не так — программа/подпрограмма необратимо умирает. Отсюда необходимость в тех же кэшах ФС — они были бы не нужны, если бы программы умели ждать окончания ввода-вывода. К сожалению, во всех популярных ЯП за идемпотентностью приходится следить только руками, хотя бы обращаясь только к идемпотентным функциямм и объектам.

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)