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

Всем привет) подскажите куда копать - есть у меня ендпоинт

который юзер может вызвать несколько раз подряд - создание подписки. но пока данные не записались в базу, api не может знать что у него она есть. по этому возможно что если два запроса идут с маленькой задержкой, то пописка создасться два раза - так как api ждет ответ от stripe. как это можно решить без очередей?

21 ответов

15 просмотров

Записываешь данные об ожидании подписки в условный редис и проверяешь Подписка записалась в базу - удалил из редиса

Maks- Автор вопроса
Михаил Золотарёв
Записываешь данные об ожидании подписки в условный...

тут минус в том что если что то пойдет не так, то этот кеш надо будет чистить потом или с ttl ставить. короче может получитсья что и подписки нет и создать ее еще раз нельзя

У тебя получается, что транзакция в базу данных не закрывается, пока не получен ответ от stripe?

Maks
не это mongo

НУ всё ранво, обхясни как оркестровка происходит между сохранненим в бд и отправкой запроса в stripe

Maks- Автор вопроса
John Doe
НУ всё ранво, обхясни как оркестровка происходит м...

в двух словах если получилось списать за подписку, то обновляется данные подписки в user.subscription проперти

Тебе нужны локи. В монге вроде только optimistic locking можно сделать

Maks
в двух словах если получилось списать за подписку,...

Получается, сначала идет запрос в страйп, и если он успешный, то запрос в бд для обновления данных подписки в user.subscription проперти?

Maks- Автор вопроса
John Doe
Получается, сначала идет запрос в страйп, и если о...

да в этом и проблема что если ответ будет долгий от страйпа или два раза очень рядом пройдут два запроса, то не успеет обновьтся состояние подписки.

Ну да. По version полю. По монге много туториалов на эту тему должно быть. Но может это и не то, что тебе надо. Я чет не особо читал, что ты еще писал

Мне кажется проблема в том, что ты хочешь сделать транзакционную консистентность между запросом к стороннему сервису и в свою бд. Это тоже можно сделать, но самому реализовывать транзакционную консистентности мне кажется проблемно. А что если отказаться от транзакций и сделать eventual consistency? Что-то типа - создать инвойс, показать юзеру что он в процессе оплаты. А когда оплатится, то перевести в статус оплачено и активировать подписку

Maks- Автор вопроса
Alexander
Ну да. По version полю. По монге много туториалов ...

если оч коротко: updateSubscription() { // 1. call stripe to create subscription // 2. update user.subscription }

Maks
если оч коротко: updateSubscription() { // 1. ca...

А ты когда к страйпу 2 раза обращаешься, два раза у пользователя деньги снимаешь?

Maks- Автор вопроса
John Doe
Мне кажется проблема в том, что ты хочешь сделать ...

это конечно идеальный вариант, но это не с нуля система пишется, кое что изменять нельзя, иначе надо будет обновлять UI которому оч много лет. короче пока наверно самое эффективное это lock для документа. типа надо сразу включать весь функционал если оплата прошла успешно, а если все это реализовывать сейчас то это надолго.

Maks
если оч коротко: updateSubscription() { // 1. ca...

А вот еще вопрос Ты сделал запрос в stripe, но связь оборвалась. Ты это как будешь разруливать? Ведь нет гарантии того, что оплата не прошла

John Doe
А вот еще вопрос Ты сделал запрос в stripe, но св...

После каждого запроса слать проверочный?

Андрей
После каждого запроса слать проверочный?

А бац и еще раз оборвалась связь. Не смог проверить

Андрей
После каждого запроса слать проверочный?

Ну и ещё момент. Может быть так, что проверочный запрос вернул, что деньги не списались из-за того, что первый (оборванный) запрос ещё не завершился В итоге клиент не получает то, за что он заплатил

John Doe
Ну и ещё момент. Может быть так, что проверочный з...

Интересно, в таком случае мало что можно сделать.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
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
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта