Бесконечное масштабирование с использованием лямбды и mysql приводит к неверным данным - PullRequest
0 голосов
/ 08 ноября 2018

мы пытаемся достичь бесконечной масштабируемости, чтобы ускорить наши процессы, используя архитектуру без серверов, и используем 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, поэтому они добавили в него значение своего события, и вычисление пошло не так.

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

Любая помощь будет оценена

1 Ответ

0 голосов
/ 08 ноября 2018

Ваша таблица, кажется, только добавляется, и способ вычисления баланса неверен, потому что у вас может быть несколько записей, которые вставляются одновременно и используют одни и те же данные.

Вы можете сохранить баланс в другой таблице, где вы обновите его, запустив запрос на обновление, подобный следующему: UPDATE table SET balance = balance + ? WHERE product_id = ?

...