Привет, хочу добится большой производительности в апи.
Сейчас модель проста: Запрос -> в бд -> ответ
И проблем с конкуретностью нет ибо транзакции помогают и доп условие помогает.
Хочу делать все в кеше, и периодически кеш заливать в бд.
Возник вопрос по concurrency.
Вот кейс
2 Потока одновременно хотят сменить баланс юзеру
Оба взяли 1 стейт (100 грн), но какой-то из них первый залил новый стейт (120)
Второй соответственно про это не знает и валит туда свое значение от 100
Когда я планировал это делать я думал буду записывать евенты изменений (ChangeBalance +100) (ChangeBalance +40)
и перед заливкой в бд сагрегировать все в кучу и сохранить.
Но тут та же проблема, коллекция событий в кеше, я тяну коллекцию с кеша добавляю туда event и сохраняю, и тут есть возможность что я затру изменения другого потока.
Как можно решить эту проблему? Хотя бы отменить перезапись кеша, чтоб не терять данные
Не специалист по concurrency, однако считаю, что само изменение баланса не стоит выполнять конкурентно.
Думаю, стоит класть задачи по изменению баланса в очередь и чтобы у очереди было множество параллельных обработчиков. Таким образом, за каждое изменения баланса будет отвечать лишь один обработчик.