В настоящее время я создаю систему, в которой S3 будет использоваться как постоянный хеш-набор (URL-адрес S3 определяется из данных) множеством компьютеров через Интернет. Если два узла хранят одни и те же данные, он будет сохранен с использованием одного и того же ключа, и поэтому он не будет храниться дважды. Когда объект удаляется, мне нужно знать, используют ли другие другие node (s) эти данные. В этом случае я не удалю его.
Сейчас я реализовал его, добавив список узлов хранения как часть данных, записанных на S3. Поэтому, когда node хранит данные, происходит следующее:
- Прочитайте объект с S3.
- Дезертициализация объекта.
- Добавить новый node id в список хранения узлов.
- Сериализовать новый объект (данные для хранения и node -list).
- Запишите сериализованные данные на S3.
Это создаст форму подсчета ссылок idempotent. Поскольку запросы через Интернет могут быть довольно ненадежными, я не хочу просто подсчитывать количество узлов хранения. Поэтому я сохраняю список вместо счетчика (в случае, если node отправляет один и тот же запроs > 1 раз).
Этот подход работает до тех пор, пока два узла не записываются одновременно. S3 не знает (насколько я знаю) любого способа блокировки объекта, чтобы все эти 5 шагов стали атомарными.
Как бы вы решили эту проблему concurrency? Я рассматриваю возможность реализации некоторой формы оптимизма concurrency. Как мне это сделать для S3? Должен ли я использовать совершенно другой подход?