170 похожих чатов

Ребят, приветствую. Столкнулся впервые с такой проблемой. Разбил приложение на микросервисы. В одном

сервисе хочу провести оплату счета, открываю записать счета в транзакции, стучусь к микросервисы биллинга, там провожу вставку финансовой транзакции, и увеличиваю баланс счёта в транзакции FOR UPDATE.
На вставке финансовой транзакции все зависает до истечения таймаута.
Долго бился, потом понял, что она блокируется первой транзакцией, но они не пересекаются. В таблице транзакций только foreign key к таблице с инвойсами.
Почему так?
Ключ убил, все стало работать идеально...

8 ответов

31 просмотр

Много ошибок на самом деле > Разбил приложение на микросервисы I: Чтобы что? Какие ставились цели? > открываю записать счета в транзакции, стучусь к микросервисы E: Долгоживущие транзакции — зло. Сетевые запросы с открытой транзакцией — антипаттерн > там провожу вставку финансовой транзакции, и увеличиваю баланс счёта в транзакции FOR UPDATE W: Кажется, тут сказано слишком много дичи. Переформулируйте. Звучит при любом раскладе стрёмно > На вставке финансовой транзакции все зависает до истечения таймаута. W: Вследствие предыдущего пункта — не совсем понятно, откуда ноги растут > В таблице транзакций только foreign key к таблице с инвойсами. > Ключ убил, все стало работать идеально... W: Не совсем понятно, как вы работаете с этими данными

Andrey-Kolkov Автор вопроса
kai 3341
Много ошибок на самом деле > Разбил приложение на...

1 изолировать кодовую базу. 2. как надо делать ,если нужно по сути сделать работу и использовать транзакцию? 3. звучит нормально. Как foreign key на это влияет? Т.е. mysql полагает, что я могу удалить тут ссылку, на которую ссылается foreign key, потому, что если я ее изменю, то не пофиг ли?

Andrey Kolkov
1 изолировать кодовую базу. 2. как надо делать ,ес...

Несколько микросервисов, работающих с одной БД - это на 99% ошибка в архитектуре. Про транзакции между несколькими микросервисами - почитайте про saga, только учтите что это просто подход/идея, а не конкретная реализация.

Andrey-Kolkov Автор вопроса
Sergey Bezrukov
Несколько микросервисов, работающих с одной БД - э...

Это не ошибка, это процесс. они там разделены префиксами. Т.е. по факту при разработке они не пересекаются, но удобные внешние ключи, котре я и использовал. Я много читал про распределенные транзакции, но тут по сути то все нормально было, просто не понимал почему обычный запрос на вставку повисал, никогда не думал, что через внешние ключи это может заблокироваться. Если бы не нашел как это посмотреть, не смог бы догадаться. Т.е. сами транзакции не пересекаются. Пересечение только по внешнему ключу происходило. Причем 99% вставок в таблицу транзакций происходило нормально, и только вставка транзакции с оплатой по счету все вешала. У меня мозг взрывался.

Andrey-Kolkov Автор вопроса

Это не странно, это помогает в разработке экономить время. По сути это пока еще стартап. Тут все уместно.)

Andrey Kolkov
Это не странно, это помогает в разработке экономит...

В разработке может быть. Тем более в стартапе. Только у вас сервис А открывает свою транзакцию, потом вызывает Б, у которого своя транзакция. Что будет, если Б успешно отработает, закоммитив свои данные, а при коммите транзакции в сервисе А произойдёт облом?

Andrey-Kolkov Автор вопроса
Sergey Bezrukov
В разработке может быть. Тем более в стартапе. Тол...

Наверное будет правильнее сущность счета (invoice) в моем случае, перенести в биллинг. Пусть в нем выписывают и в нем же оплачивают их. Тогда все будет в единой транзакции проходить. Спасибо!

Sergey Bezrukov
Несколько микросервисов, работающих с одной БД - э...

Протестую -- формально селери и ему подобные бэкграунд воркеры являются микросервисом, при этом они именно что должны работать в одном пространстве с вебом. А могут и без веба. Всё зависит от контекста

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта