Size: a a a

2022 January 16

D

Dmitry in symfony
видимо я где-то не понимаю вашу мысль
вы можете расписать на низком уровне как у вас будет происходить обновление баланса и разрешение на транзакцию? может так будет лучше понятно
источник

D

Dmitry in symfony
как я себе это дело вижу
источник

D

Dmitry in symfony
1. пришел запрос
2. открываем транзакцию в базе
3. считаем по ЕС от снапшота до текущего момента баланс
4. если баланса хватает - пишем транзакцию в ЕС таблицу на -100
5. коммитим транзакцию
6. даем ответ ОК на запрос

и вот таких будет 1000 штук в секунду, обработка будет на разных инстансах железа у бекенда
источник

AD

Andrey Dembitskyi in symfony
@PrimoSecundoTertio
https://youtu.be/KPl6quKgffo
https://youtu.be/wMcWo2cT7Ck

Не смотрел, но докладчика хвалили
источник

D

Dmitry in symfony
благодарствую, отсмотрю
источник

✨Basic_Instinct✨ in symfony
ну в принципе верно описано, но мы не обновляем, мы делаем инсерт новой транзакции, что по сути исключает конкурнетные запросы, и если в какой-то момент вдруг баланса станет недостаточно - получим ответ недостоточно средств
источник

✨Basic_Instinct✨ in symfony
вообще можно даже одним запросом попробовать insert делать с условием типа WHERE SELECT SUM() >= :value ......
источник

✨Basic_Instinct✨ in symfony
вот и вся твоя транзакция insert
источник

✨Basic_Instinct✨ in symfony
insert вернул результат - ОК, пустой результат - недостаточно средств
источник

D

Dmitry in symfony
хорошо, я вас понял
в любом случае получим обновление баланса в один поток (транзакции acid) и до тех пор пока сервер выдерживает
источник

D

Dmitry in symfony
а что делать когда он перестал выдерживать ? как масштабировать ?
источник

✨Basic_Instinct✨ in symfony
если подключить сюда репликацию и cqrs, то проблем не должно быть
источник

D

Dmitry in symfony
реплики только на чтение, мы чтение не обсуждаем пока что
источник

D

Dmitry in symfony
cqrs это не из этой оперы
источник

✨Basic_Instinct✨ in symfony
ну мастер будет обновляться, ну а в лк читать будешь и цифры выводить
источник

D

Dmitry in symfony
мастер не выдерживает инсертов и проверок на баланс  - вот что тогда делать ?
источник

✨Basic_Instinct✨ in symfony
несколько мастеров и балансировка, но я в этом уже не буду давать советы как
источник

SP

Sergey Protko in symfony
Стандартная схема лэджера - две транзакции + ивеншуал консистенции + шардинг/партицирование
источник

SP

Sergey Protko in symfony
1. Изменение баланса затрагивает один аккаунт за раз. Аккаунт наша партиция, мы можем раскидывать партиции на разные ноды базы.
2.перевод с одного аккаунта на другой это всегда две транзакции на двух аккаунтах

Такая схема должна хорошо масштабироваться.

Если проблема что тысяча транзакций в пределах аккаунта - если у тебя es можно в целом не полагаться на базу и там мутить всякие райплайны курсоры и батчинг.
источник

SP

Sergey Protko in symfony
В целом 1000 транзакций звучит не так уж и много
источник