мы пытаемся достичь бесконечной масштабируемости, чтобы ускорить наши процессы, используя архитектуру без серверов, и используем AWS sqs поверх lambdas
наши данные представляют собой цепочку мутаций, которые строятся друг на друге на основе идентификатора.
id productId eventDate eventValue balance
1 1 2018-09-01 100 100
2 1 2018-09-01 100 200
Как вы можете видеть, взять баланс из предыдущей строки, добавить в него значение события и получить новый баланс - это очень просто, и каждое новое значение получается из sqs, который вызывает лямбду, и наш процесс затем вычисляет значение и добавляет запись в наш таблица событий. проблема в том, что когда несколько сообщений пинают его, порождают несколько лямбд, и все они ищут предыдущую строку, и мы получаем последнюю сохраненную запись и в итоге получаем что-то вроде
id productId eventDate eventValue balance
1 1 2018-09-01 100 100
2 1 2018-09-01 100 200
3 1 2018-09-01 100 300
4 1 2018-09-01 100 300
5 1 2018-09-01 100 300
проблема в том, что все они думали, что их предыдущий баланс строк равен 200, поэтому они добавили в него значение своего события, и вычисление пошло не так.
Мы можем связать входные данные и выполнить операцию одну за другой, но это полностью убило бы цель масштабирования и в долгосрочной перспективе сделало бы вещи действительно медленными с большим вводом. оптимистическая блокировка, похоже, тоже нам не помогает, потому что это новая запись, основанная на предыдущей записи.
Любая помощь будет оценена