Как добиться согласованности сильного удаления в Global Tables DynamoDB - PullRequest
1 голос
/ 20 июня 2019

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

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы никогда не сможете гарантировать строгую согласованность для глобальных таблиц.

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

Самый простой способ гарантировать, что удаление не сопровождается обновлением, - это использование определенной области в качестве «основной» области для каждого элемента. Если вам нужно обновить или удалить элемент, используйте конечную точку для основного региона. Недостаток заключается в том, что межрегиональные записи будут иметь гораздо большую задержку, чем записи в тех же регионах. Однако это может быть приемлемым компромиссом в зависимости от деталей вашей заявки.

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

Так что это принцип, но на самом деле есть что-то, чтобы вам было еще проще. DynamoDB добавляет несколько специальных атрибутов ко всем элементам в глобальной таблице (см. Глобальные таблицы - как это работает ), и один из этих атрибутов - aws:rep:updateregion, который является регионом, в котором он был последний раз обновлен. Просто убедитесь, что когда вам нужно обновить или удалить элемент, вы читаете этот атрибут и затем используете конечную точку для этого региона, чтобы сделать запрос на обновление / удаление.

0 голосов
/ 22 июня 2019

Ищете ли вы обновление с ошибкой или достаточно, чтобы запись была удалена, если она была удалена до обновления?

Если последнее, то это почти то, что произойдет: элементы будут удалены; иногда до обновления, иногда после; но они всегда удаляются. Единственное отличие состоит в том, что некоторые обновления будут успешными, а другие - неудачными, в зависимости от порядка операций

Однако, если вам нужно, чтобы обновления всегда терпели неудачу, я боюсь, что вам нужно создать распределенную глобальную блокировку: это будет дорого и медленно.

Если вы хотите убедиться в этом сами, я рекомендую настроить тест: создайте глобальную таблицу и добавьте несколько элементов (скажем, 10 000), а затем с двумя клиентами DynamoDB из одного экземпляра EC2 выполните запросы DELETE и UPDATE. в двух разных регионах в тесной петле. В конце вы должны увидеть, что все элементы удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...