Вот общая проблема состояния гонки
- Ресурс создан со списком
- ServiceA и ServiceB хотят добавить что-то в список в Resource
- ServiceA получает Ресурс (list = [])
- ServiceB получает ресурс (list = [])
- ServiceA обновляет ресурс (list = [A]) и успешно
- ServiceB обновляет ресурс ( list = [B]) и успешно
Ожидается: ресурс (список = [A, B]) или исключение
Факт: ресурс (список = [B]) И что еще хуже, это тихая ошибка
С помощью DynamoDB Optimisti c Блокировка с номером версии , мы можем решить эту проблему, и сценарий выглядит следующим образом.
- Ресурс создается со списком (и версия = 1)
- ServiceA и ServiceB хотят добавить что-то в список внутри ресурса
- ServiceA получает ресурс (list = [] , версия = 1)
- ServiceB получает ресурс (список = [], версия = 1)
- ServiceA обновляет ресурс (l ist = [A], версия = 1) и успешно (версия становится 2)
- ServiceB обновляет ресурс (список = [B], версия = 1) и завершается ошибкой, потому что версия отстает
Таким образом, ServiceB уведомляется о сбое и может решить повторить попытку, повторно загрузив Ресурс (с версией = 2 и списком = [A]) и обновив Ресурс (список = [A, B] , версия = 2).
DynamoDB управляет версией для вас. При создании ресурса он устанавливает значение 1, автоматически увеличивает его при каждом обновлении и создает исключение, если версии не совпадают.
У меня вопрос, можно ли выставлять эту версию клиенты во время их запросов Get (предполагая, что клиент - это не наш код, а какой-то другой сервис, принадлежащий нашей организации) и позволяют им предоставлять его во время запросов на обновление?
- Первая часть вопрос в том, возможно ли это технически?
- Вторая часть вопроса - это хорошая практика? (ie. Есть ли проблемы с этим, даже если мы технически можем?)