The Ant
ну промисы так работают 🤷♂️
Kirill
$a = a();
$b = b();
Kirill
вот тебе асинхронный код на файберах
The Ant
с промисами я бы мог что-то такое:
$bus->dispatch($c1)
->then(fn() => $bus->dispatch($c2));
Kirill
Так и сделать
Kirill
без всяких then
The Ant
если 2 воркера то обработается не последовательно
The Ant
хоть файберы хоть нет
Kirill
Kirill
проблем-то
The Ant
как? )
Kirill
для начала - оно и так будет последовательно
Kirill
потому что для кооперативного режима нужно написать соответствующий метод
Kirill
вроде: [$result1, $result2] = Task::all([$bus->dispatch(...), $bus->dispatch(...)]);
Павел
Павел
Мне кажется тут проблема скорее в том, что отсутствует какой то статус "processed"
Павел
Павел
Если видео перезаливается - оно опять будет в процессе обработки
The Ant
Павел
Обычно когда ищутся костыли, часто проблема именно в флоу
The Ant
Павел
Опять же, ты говоришь, что есть создано , но его нельзя редачить. А какой статус, когда можно редачить/пользоваться?
Павел
The Ant
как ты говоришь статус processing, но процессинг не отражает действия
Павел
Алексей
Доп поле добавить? Можно или нельзя
Павел
Именно по флоу проблема, а не по твоему решению
The Ant
в коде
Павел
The Ant
а не в хендреле команды или в левом сервисе
Павел
И зачем?
Павел
Ты сам говоришь, что created ставится после обработки
Павел
А ты хочешь выставить ДО
Павел
Павел
ты хочешь поставить created, когда еще не created
Павел
Может быть сделать второй статус, процесс для видео?
Павел
Или почему ты не моешь в хэндлеое обработки поставить статус?
Kirill
статусы - это всегда фиговый вариант
Павел
Kirill
вешай LOCK FOR UPDATE
Kirill
Почему?
потому что при деплое повесятся таски
Kirill
деплой запустился, воркеры обработки пошли на рестарт
Kirill
так и останется висеть со статусом кривым
Павел
И тут уже решать проблемы идемпотентности если они есть
Kirill
а если 5 из 10 воркеров, которые что-то делают помрут из-за нехватки памяти, например?
Kirill
как понять что 5 из 10 статусов "в работе" нифига не в работе?
The Ant
Kirill
поэтому самый грамотный вариант - это делать LOCK FOR UPDATE, т.к. если залочится запись, то будет означать процессинг, а когда что-то упадёт - коннкешн обрывается и рекорд обратно в список возвращается
The Ant
если я делаю задачу загрузки видео в сторадж, уже не порядок
Павел
Kirill
Kirill
одной строки)
Kirill
можно так же и селект делать, скипая записи, которые уже кто-то захавал себе
Kirill
select for update skip locked
The Ant
Kirill
Kirill
или ты о чём?
The Ant
про это да
Kirill
у тебя 1000 воркеров, надо понять что в работе, а что нет
Kirill
если будешь обновлять - случиться рейс кондишн
Павел
так и останется висеть со статусом кривым
Такая проблема есть с кривотой, когда что то падает, соглашусь. Не решали так как нет массовости. С другой стороны воркер может и 2 задачи выполнять, т.е. быть не идемпотентными до конца.
Kirill
т.к. селект и апдейт не атомарные
Kirill
Kirill
но 2 воркера уже не должны 1 задачу выполнять
Kirill
а в коде выше вначале транзакция, потом селект, потом апдейт и коммит где-то далеко