сервисе хочу провести оплату счета, открываю записать счета в транзакции, стучусь к микросервисы биллинга, там провожу вставку финансовой транзакции, и увеличиваю баланс счёта в транзакции FOR UPDATE.
На вставке финансовой транзакции все зависает до истечения таймаута.
Долго бился, потом понял, что она блокируется первой транзакцией, но они не пересекаются. В таблице транзакций только foreign key к таблице с инвойсами.
Почему так?
Ключ убил, все стало работать идеально...
Много ошибок на самом деле > Разбил приложение на микросервисы I: Чтобы что? Какие ставились цели? > открываю записать счета в транзакции, стучусь к микросервисы E: Долгоживущие транзакции — зло. Сетевые запросы с открытой транзакцией — антипаттерн > там провожу вставку финансовой транзакции, и увеличиваю баланс счёта в транзакции FOR UPDATE W: Кажется, тут сказано слишком много дичи. Переформулируйте. Звучит при любом раскладе стрёмно > На вставке финансовой транзакции все зависает до истечения таймаута. W: Вследствие предыдущего пункта — не совсем понятно, откуда ноги растут > В таблице транзакций только foreign key к таблице с инвойсами. > Ключ убил, все стало работать идеально... W: Не совсем понятно, как вы работаете с этими данными
1 изолировать кодовую базу. 2. как надо делать ,если нужно по сути сделать работу и использовать транзакцию? 3. звучит нормально. Как foreign key на это влияет? Т.е. mysql полагает, что я могу удалить тут ссылку, на которую ссылается foreign key, потому, что если я ее изменю, то не пофиг ли?
Несколько микросервисов, работающих с одной БД - это на 99% ошибка в архитектуре. Про транзакции между несколькими микросервисами - почитайте про saga, только учтите что это просто подход/идея, а не конкретная реализация.
Это не ошибка, это процесс. они там разделены префиксами. Т.е. по факту при разработке они не пересекаются, но удобные внешние ключи, котре я и использовал. Я много читал про распределенные транзакции, но тут по сути то все нормально было, просто не понимал почему обычный запрос на вставку повисал, никогда не думал, что через внешние ключи это может заблокироваться. Если бы не нашел как это посмотреть, не смог бы догадаться. Т.е. сами транзакции не пересекаются. Пересечение только по внешнему ключу происходило. Причем 99% вставок в таблицу транзакций происходило нормально, и только вставка транзакции с оплатой по счету все вешала. У меня мозг взрывался.
Это не странно, это помогает в разработке экономить время. По сути это пока еще стартап. Тут все уместно.)
В разработке может быть. Тем более в стартапе. Только у вас сервис А открывает свою транзакцию, потом вызывает Б, у которого своя транзакция. Что будет, если Б успешно отработает, закоммитив свои данные, а при коммите транзакции в сервисе А произойдёт облом?
Наверное будет правильнее сущность счета (invoice) в моем случае, перенести в биллинг. Пусть в нем выписывают и в нем же оплачивают их. Тогда все будет в единой транзакции проходить. Спасибо!
Протестую -- формально селери и ему подобные бэкграунд воркеры являются микросервисом, при этом они именно что должны работать в одном пространстве с вебом. А могут и без веба. Всё зависит от контекста
Обсуждают сегодня