Size: a a a

2021 January 14

КГ

Константин Грачев... in symfony
Может вот эта штука включена с нулём? \Symfony\Component\Messenger\EventListener\StopWorkerOnFailureLimitListener
источник

КГ

Константин Грачев... in symfony
В случае ошибки он пытается ретрай сделать, если ретрай падает с ошибкой то это уже не ловится и он выходит. У меня проблема тут, но я там сам кидаю исключение в своём траспорте
источник

МК

Мирко Крокоп... in symfony
Привет, ребята!
Что то столкнулся с простой задачей - несколько операций по модификации данных в разных таблицах обернуть в транзакцию.

Вбиваю в доке (https://symfony.com/doc/current/index.html) в строку поиска волшебное слово "transaction" и ... вижу описание более сложных кейсов с событиями и диспатчерами итд итп.

В более старой доке версии 2.7 нашел вариант использования транзакции при непосредственной работе с сущностями:

$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
   $user = new User; $user->setName('A');
   $em->persist($user); $em->flush();
   $em->getConnection()->commit();
} catch (Exception $e) {
   $em->getConnection()->rollBack();
   throw $e;
}

Уже лучше. Но что, если нужно обернуть в транзакцию не дейсвтия над entity, а вызов методов других сервисов?
Подскажите, пожалуйста, возможно ли это сделать в Symfony?
источник

D

Dmitry in symfony
Мирко Крокоп
Привет, ребята!
Что то столкнулся с простой задачей - несколько операций по модификации данных в разных таблицах обернуть в транзакцию.

Вбиваю в доке (https://symfony.com/doc/current/index.html) в строку поиска волшебное слово "transaction" и ... вижу описание более сложных кейсов с событиями и диспатчерами итд итп.

В более старой доке версии 2.7 нашел вариант использования транзакции при непосредственной работе с сущностями:

$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
   $user = new User; $user->setName('A');
   $em->persist($user); $em->flush();
   $em->getConnection()->commit();
} catch (Exception $e) {
   $em->getConnection()->rollBack();
   throw $e;
}

Уже лучше. Но что, если нужно обернуть в транзакцию не дейсвтия над entity, а вызов методов других сервисов?
Подскажите, пожалуйста, возможно ли это сделать в Symfony?
все делаете так же, только все операции надо проводить через коннект от EM а не новый создавать
источник

D

Dmitry in symfony
т.е в ваш сервис передаете коннект от EM
источник

МК

Мирко Крокоп... in symfony
Dmitry
т.е в ваш сервис передаете коннект от EM
Благодарю за ответ!
А случайно не подскажете, где можно почитать подробнее или посмотреть пример? А то кажется сложновато на первый взгляд.

В том же Laravel есть вариант просто обернуть несколько вызовов методов сервисов ничего в них не передавая дополнительно и они будет объединены в одну транзакцию:

DB::transaction(function() use ($validated) {
 // И тут любые дейсвтия совершаем,
 // они автоматически обернутся
 // в одну транзакцию. Например:
   $user = User::create($validated);
   $this->createDefaultPreferences($user);
   $keys = ExternalService::getKeysForUser($user->id);
   $user->keys()->create([ 'keys' => $keys ]);
});
источник

SB

Sergei Baikin in symfony
Константин Грачев
В случае ошибки он пытается ретрай сделать, если ретрай падает с ошибкой то это уже не ловится и он выходит. У меня проблема тут, но я там сам кидаю исключение в своём траспорте
ну мне надо чтобы оно в DLQ уходило и всё
Смысл то какой умирать
нормальный процесс
источник

D

Dmitry in symfony
Мирко Крокоп
Благодарю за ответ!
А случайно не подскажете, где можно почитать подробнее или посмотреть пример? А то кажется сложновато на первый взгляд.

В том же Laravel есть вариант просто обернуть несколько вызовов методов сервисов ничего в них не передавая дополнительно и они будет объединены в одну транзакцию:

DB::transaction(function() use ($validated) {
 // И тут любые дейсвтия совершаем,
 // они автоматически обернутся
 // в одну транзакцию. Например:
   $user = User::create($validated);
   $this->createDefaultPreferences($user);
   $keys = ExternalService::getKeysForUser($user->id);
   $user->keys()->create([ 'keys' => $keys ]);
});
это не значит что это верное решение
источник

SB

Sergei Baikin in symfony
Константин Грачев
Может вот эта штука включена с нулём? \Symfony\Component\Messenger\EventListener\StopWorkerOnFailureLimitListener
в моей версии этого листенера даже не существует
источник

КГ

Константин Грачев... in symfony
Sergei Baikin
ну мне надо чтобы оно в DLQ уходило и всё
Смысл то какой умирать
нормальный процесс
В DLQ уходит корректно?
источник

КГ

Константин Грачев... in symfony
Если нет, то возможно в этом и проблема? Падает потому что в DLQ не смог записать
источник

D

Dmitry in symfony
Sergei Baikin
Подскажите как сделать так чтобы symfony messenger не убивал консюмер в случае ошибки а просто логировал оную?
Очень раздражает что под в кубере дохнет постоянно и алерты прилетают.
Ничего не вышло нагуглить.
Используется версия v4.2.4
Последний проект в котором это поделие не выпилили еще подложил свинью при перезде в кластер.
заверните весь код консьюмера в трай кетч
источник

SB

Sergei Baikin in symfony
Константин Грачев
В DLQ уходит корректно?
SQS сам туда уводит потому что оно умирает при консюминге сообщения
источник

SB

Sergei Baikin in symfony
Dmitry
заверните весь код консьюмера в трай кетч
этот код в вендоре
источник

D

Dmitry in symfony
вендоровский консьюмер пользуете ? правильно понял ?
источник

D

Dmitry in symfony
накидайте простенький враппер над ним да и все. вызывайте свой из консоли, в коде дергайте вендора в трай кетч
источник

SB

Sergei Baikin in symfony
Dmitry
вендоровский консьюмер пользуете ? правильно понял ?
ну да там сифони месендер консюмер используется
Я хштел без модификации кода попрросить его не умирать
ну типа должен же компонент иметь такую опцию
источник

D

Dmitry in symfony
Sergei Baikin
ну да там сифони месендер консюмер используется
Я хштел без модификации кода попрросить его не умирать
ну типа должен же компонент иметь такую опцию
а как вы себе это представляете технически ? если там ексепшн вылетает, например?
источник

D

Dmitry in symfony
из-за какой ошибки падает кстати ?
источник

D

Dmitry in symfony
еще как вариант сделайте на supervisord конфиг который будет автоматически поднимать консьюмер опять
источник