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