Size: a a a

Saint P Ruby Community

2020 March 13

AK

Anatoliy Kurichev in Saint P Ruby Community
Вебкам-разработчик
источник

v

vizvamitra in Saint P Ruby Community
Anatoliy Kurichev
Вебкам-разработчик
Не, это если ты на твиче за донаты кодишь)
источник
2020 March 14

DP

Di P in Saint P Ruby Community
Ребят, подскажите как можно справиться с такой проблемой:
Есть актив рекорд транзакция внутри которой происходит некий набор бизнес логики, в том числе вызов внешних сервисов, еще кой чего, в том числе запись в бд диагностической информации. И вот если что-то пошло не так, транзакция откатывается. Но и диагностическая информация в бд тоже не записывается, вообще теряясь, она ж внутри транзакции.
После гугления видится только вариант что диагностическую инфу писать в отдельном потоке на отдельном соединении с бд, тогда откат материнской транзации на это соединение не повлияет.
Ну или отрефакторить код чтобы запись диагностической инфы была вне материнской транзации.
Но может кто еще какие варианты может предложить? Рельса 4.2.
источник

NS

Nikita Shilnikov in Saint P Ruby Community
сказать по правде, делать внешние вызовы в транзакциях не лучшая идея
источник

O

Odebe in Saint P Ruby Community
Может реализовать транзакцию как часть процесса, а не записи в базу? Как часть самой апликухи
источник

NS

Nikita Shilnikov in Saint P Ruby Community
that said, решение ты нагуглил правильное
источник

NS

Nikita Shilnikov in Saint P Ruby Community
насколько оно может быть правильным
источник

NS

Nikita Shilnikov in Saint P Ruby Community
я думаю активрекорд можно как-то упросить использовать другое соединение в том же потоке, но это не точно
источник

O

Odebe in Saint P Ruby Community
Кидать запись диагностических данных в сайдкик?..
источник

NS

Nikita Shilnikov in Saint P Ruby Community
поток все-таки проще, уж не знаю как потом это тестить правда, потому что я вот откатываю транзакции в конце теста
источник

DP

Di P in Saint P Ruby Community
Nikita Shilnikov
сказать по правде, делать внешние вызовы в транзакциях не лучшая идея
Ок, буду знать, спасибо. Как то в голову не приходило.
источник

NS

Nikita Shilnikov in Saint P Ruby Community
Di P
Ок, буду знать, спасибо. Как то в голову не приходило.
транзакция должна быть идемпотентной, чтобы ее можно было перезапустить при необходимости. Помимо этого, вызовы во внешние сервису начинают блокировать соединения к базе данных, а это довольно ограниченный ресурс. А еще бывают истории, когда внешние запросы залипают, оставляя транзакцию открытой, тут вообще начинается цирк
источник

DP

Di P in Saint P Ruby Community
Nikita Shilnikov
транзакция должна быть идемпотентной, чтобы ее можно было перезапустить при необходимости. Помимо этого, вызовы во внешние сервису начинают блокировать соединения к базе данных, а это довольно ограниченный ресурс. А еще бывают истории, когда внешние запросы залипают, оставляя транзакцию открытой, тут вообще начинается цирк
Спасибо. Буду курить в сторону рефакторинга этого кода, аргументы более чем убедительные. Хотя вариант с отдельным коннекшном к бд для общего развития тоже попробую. может в других случая пригодиться.
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
Odebe
Кидать запись диагностических данных в сайдкик?..
а если в логи записывать?
источник

O

Odebe in Saint P Ruby Community
Dmitry Tsepelev
а если в логи записывать?
Да, но тогда, если потом нужны какие-то операции над этими данными, то придётся как-то парсить логи или записывать в виде джисона.
У нас инфа по важным процессам пишется в базу и потом в отдельный лог пишется короткая сводка.
(И на почту отправляется оповещение, если есть ошибки (прикручивание сентри в процессе)).
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
Ну парсить логи вроде не беда, можно помечать их каким–нибудь ID операции общим
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
либо можно про саги почитать
источник

O

Odebe in Saint P Ruby Community
Dmitry Tsepelev
либо можно про саги почитать
Никогда не слышал. Спасибо, почитаю
источник
2020 March 15

AN

Artem Napolskih in Saint P Ruby Community
Di P
Ребят, подскажите как можно справиться с такой проблемой:
Есть актив рекорд транзакция внутри которой происходит некий набор бизнес логики, в том числе вызов внешних сервисов, еще кой чего, в том числе запись в бд диагностической информации. И вот если что-то пошло не так, транзакция откатывается. Но и диагностическая информация в бд тоже не записывается, вообще теряясь, она ж внутри транзакции.
После гугления видится только вариант что диагностическую инфу писать в отдельном потоке на отдельном соединении с бд, тогда откат материнской транзации на это соединение не повлияет.
Ну или отрефакторить код чтобы запись диагностической инфы была вне материнской транзации.
Но может кто еще какие варианты может предложить? Рельса 4.2.
Если прямо очень нужно, то такое делается через autonomous transaction, которые есть не везде.
источник

AN

Andrey Novikov in Saint P Ruby Community
Artem Napolskih
Если прямо очень нужно, то такое делается через autonomous transaction, которые есть не везде.
+ (в постгресе нету, но народ костылит через foreign data wrapper)
источник