Как обрабатывать денежные операции в неблокирующей системе? - PullRequest
4 голосов
/ 27 июня 2019

Я работаю на рекламном сервере (вроде RTB), есть рекламодатели, которые платят за продвижение своих рекламных кампаний.

Когда пользователь посмотрел рекламу, я хочу снять с рекламодателя плату.

Рекламные кампании должны участвовать в аукционах без блокировки, это означает, что он может делать ставки на несколько рекламных запросов одновременно. Сложно сразу же выставить счет рекламодателю, так как мне придется заблокировать его баланс.

Другой подход состоит в том, чтобы не заряжать его сразу, а в отдельном процессе один раз каждые N секунд, и надеяться, что он не купил больше показов, чем он мог себе позволить. Я могу сделать какой-то пороговый кредит, который он должен был бы принять для участия в аукционах, это исключило бы большую часть перерасходов, но что, если процесс завершится, а рекламодатель не будет оплачен и слишком много переполнен, это будет проблемой.

Может кто-нибудь посоветует, пожалуйста, как эти вещи обычно обрабатываются, может быть, порекомендуете какую-нибудь книгу / статью по этой теме, пожалуйста?

1 Ответ

2 голосов
/ 06 июля 2019

Если это проблема асинхронного программирования, это означает, что вас беспокоит переоценка участника, когда он делает слишком много ставок за показ одновременно.Затем я предлагаю использовать mutex (т.е. систему блокировки).Вы можете установить пороговое значение для количества блокировок, которые участник может иметь в вашей системе в любой момент времени.Этот порог может быть равен максимальной сумме, которую покупатель готов потратить на показы.Когда претендент запрашивает ставку, блокировка этой ставки на его аккаунте должна быть отправлена ​​на ваш сервер.Когда сервер отвечает «ОК», что блокировка была создана, тогда может состояться ставка.Ставка активна до тех пор, пока ваш сервер не снимет блокировку.Это позволяет серверу отслеживать все ставки и устанавливать блокировки на всех из них.Если у претендента есть пороговое значение в 10 заявок, и он пытается сделать ставку для 11-го числа, сервер не снимет блокировку со стороны претендента, чтобы сделать эту ставку.Кроме того, если вы используете микросервисную архитектуру, я предлагаю создать службу менеджер транзакций для обработки всех этих запросов и даже использовать транзакции на основе Saga для функционального отката в случае сбоя сервера.

profile for Dalton at Stack Overflow, Q&A for professional and enthusiast programmers

...