abacabb
@abacabb
deqada

Транзакционные операции по сети, как?

Собственно, как организовать транзакционную передачу данных по сети?

Банальный пример - операция пополнения счета.
Сервис А сообщает сервису Б, что пользователь на стороне А пополнил счет. И в этот момент, при успешной операции на Б, по сети теряется ответ для А об успешности операции. Возникает ситуация, что А попытается повторно пополнить счет, т.к. ответ не был получен.

Пока вижу такой вариант, начать операцию по передаче данных, открыв транзакцию с таймаутом на Б.
При удачном ответе от Б к А, сервис А отправляет запрос на закрытие транзакции Б по данной операции.
При всех неудачных операциях, транзакция просто закрывается по таймауту.

Подскажите, что гуглить, что почитать?
  • Вопрос задан
  • 396 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Сервис А сообщает Б, что пользователь пополнил на стороне А счёт, номер этой транзакции такой-то.
Сервис Б в ответ сообщает, что транзакция обработана, ну или о какой-то ошибке в строгом формате.
Если сервис А не получает такое сообщение, то через некоторое время отправляет сообщение повторно с тем же самым номером транзакции. Если сервис Б находит такую транзакцию у себя - отвечает, что событие уже обработано. Если не находит - обрабатывает штатно как новую транзакцию.

Сервис А ставит операции статус "выполнено" только после получения ответа от Б, пока ответа нет - служебный статус "обрабатывается"
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@AntonMZ
Буду краток. Linux/Windows Administrator.
Транзакция проходит на стороне А (платежный агрегатор. пример).
После проведения операции у себя, он шлет данные к Б.
Если Б не отвечает, то А ставит отправку данных к Б в очередь и повторяет данную операцию до тех пор, пока не будет получен Ок от Б.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Сначала А посылает запрос на создание пустой (непогашенной) транзакции на Б.
"Б" возвращает в ответе идентификатор транзакции.
"А" посылает запрос на оплату транзакции с полученным идентификатором.

В случае, если ответ от "Б" не дошел до "А", а операция совершилась, то при повторной попытке оплатить транзакцию "Б" ответит ошибкой "уже оплачно".
Также такой механизм дает возможность для "А" делать запрос о статусе транзакции на "Б".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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