Юра
Ну а так походу если не нужна супер гарантия счётчика наверное да редис лучше
Юра
Это можно сделать многими способами в зависимости от возможностец и требований
Andrey
Даже на небольшом трафике будет race condition и таска может выполниться несколько раз на разных беках
Юра
Делаешь атомарный апдейт и селект. Если больше то таска не выполняется
Юра
Самый примитивный вариант
Юра
Ну короче куча нюансов дальше
Юра
А что если у тебя ошибка. Надо не забыть про декремент тогда
Alexey Mishurovskiy
Alexey Mishurovskiy
После успешного флаша дергать запрос апдейта
Andrey
Сергей
И вот тут кто то раньше успел сделать селект и тоже запустил таску
Может что то такое реализовать, там много еще чего можно, можно дату обновить когда задача взята для чистки мусора если задача вдруг помрет на пол пути и не почистит за собой...
$result = "update table_counter SET worker_instanse_id = :worker_instanse_id WHERE worker_instanse_id IS NULL AND counter % 100 = 0";
if ($result->affected_rows > 0) {
// do job
"update table_counter SET worker_instanse_id = NULL WHERE worker_instanse_id = :worker_instanse_id";
}
Юра
Неважно кто там раньше сделал селект, каждый воркер перед тем как начать работать делает свой апдейт и селект
Andrey
Я ж говорю от нагрузки зависит без локов это жесть - это можно легко потестить написав простой скрипт для консоли и запустив его скажем в 5-10 окнах
Alexey Mishurovskiy
Не ожидал что мой вопрос поднимет бурную дискуссию ))
Alexey Mishurovskiy
Alexey Mishurovskiy
Хотя в принципе логично - он зарезервил для себя место, потом если что его отдал
Юра
Ну тут либо блокировать счётчик до окончания отработки таски либо декрементить
Юра
Т.е. либо блочить и инкркментить в конце, либо инкркмент в начале и декремент в конце если ошибка
Юра
Аторойн вариант конечно же лучше
Alexey Mishurovskiy
Ну на самом деле как я вижу, ни один способ не дает 100% гарантии того, что число запросов будет = макс числу в счетчике в любом случае может быть +N дополнительных где N это число параллельных воркеров
Юра
Да не будет такого
Юра
С чего ты это взял
Юра
Сто параллельных воркеров синхронизируются в точке атомарного апдейта
Юра
Не могут два воркера сделать апдейт и получить одинаковое число
Юра
Он либо апдейтитя либо ждет пока другая транзакция закончит апдейт
Юра
Считай очередь на апдейт
Alexey Mishurovskiy
ну да, если апдейтить во время старта воркера
Alexey Mishurovskiy
согласен
Юра
Чтобы сделать аплейт строки, должен быть получен эксклюзив лок на строке
Юра
А так как спм апдейт атомарный то на него не влияют предыдущие чтения
Alexey Mishurovskiy
ну да, согласен
Alexey Mishurovskiy
с учетом того, что инкремент на уровне БД, все все будет четко
Юра
Ты даже можешь сделать dql update и например после него сделать em->refresh(entity) чтобы в памяти энтити синхронизироватт, правда на больлой нагрузке это лишнее как и вообле любой орм
Юра
Ну и с орм легко можно получить дедлок на большой нагрузке
Юра
Потому что ты плохо контролируешь границы транзакции и что там фоашится
Alexey Mishurovskiy
да для этого смысла нет. SQL просто через коннекшн бросить и все
Alexey Mishurovskiy
На самом деле у меня не будет большой нагрузки сразу, но как говориться решать проблемы по мере их поступления не хочется, лучше сделать заранее
Юра
https://habr.com/ru/post/160485/
Юра
https://habr.com/ru/post/150075/
Юра
Стоит только добавить что когда ты делаешь селект из таблицы в которой есть форин ки, бд автоматом пытается получить x-lock на строках на которые ссылается эта строка. У меня конкретно из-за этого и были дедлоки
Юра
Скажу что довольно неприятная ситуация, потому что это довольно сложно дебажить и не всегда понятно как исправить, поэтому я орм не юзаю если знаю что будет много параллельных запросов
Peter
а что можете сказать про постгрес? там блокировки работают в таком же режиме?
Andrey
Юра
Владимир
Всем привет, кто нибудь знает что за херабора может быть? пытаюсь по традиции указать в метод контроллера сущность, но почему то падает с ошибкой "Cannot autowire service "App\Domain\Product\Entity\Product": argument "$name" of method "__construct()" is type-hinted "string", you should configure its value explicitly.". Если подставить другую сущность проблемы не возникает. Symfony 4.4
Vlad
в конфигурации сервисов добавь сущности в exclude
Владимир
вроде entity исключены
Владимир
аннотация тоже вроде проставлена
Сергей
у тебя конструктор не пустой, поэтому
Владимир
ага как и другие
Владимир
с другими все ок
Vlad
Vlad
не вижу исключение ‘App\Domain\Product\Entity\*’
Владимир
добавил exclude: ['../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}', 'App\Domain\Product\Entity\*']
Владимир
без результатно
Vlad
Владимир
да точняк уже плыву видимо)
Владимир
завелось..
Владимир
а почему другие сущности исключаются?
Vlad
Vlad
скорее всего они не исключаются
Владимир
да все верно спасибо! 👍
Alexey Mishurovskiy
Коллеги, всем привет. ищу сильного Yii2 тимлид-разраба. может есть кто на примете. в ЛС плиз
Maks
Alexey Mishurovskiy
Alexey Mishurovskiy
если поделишься ссылкой - буду благодарен
Maks
ссылок нет)
Andrey
Alexander
Andrey
Жесть
Alexander
А что если битрикс перейдет на yii? Комбо.
Для самого битрикса это будет, конечно, существенный качественный рост.
Владимир
ребята а такой вопрос.. как правильно применить данную сгенерированную миграцию? в бд уже есть данные и поле как null уже числится, но миграция не проходит
Владимир
Владимир
Владимир
Владимир
Rodion
Поправь миграцию