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

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

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

8 ответов

11 просмотров

Много ошибок на самом деле > Разбил приложение на микросервисы 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
Несколько микросервисов, работающих с одной БД - э...

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта