Блокировка с помощью S3
Какой рекомендуемый способ реализовать простой механизм блокировки, который будет использоваться в сочетании с S3?
Пример того, что я хочу сделать:
- получить блокировку по id объекта
- читать объект из S3
- изменить данные
- записать объект в S3
- блокировка релиза
Идеально ищет механизм блокировки на основе облаков. Я мог бы использовать memcached локально, но тогда мне приходится иметь дело с масштабированием. Я не вижу очевидного способа реализовать легкую блокировку с любыми API AWS, но это кажется общей проблемой.
Интересно, можете ли вы использовать SimpleDB для выполнения операции захвата атома. Кто-нибудь пробовал это?
Ответы
Ответ 1
Хорошо, я провел некоторое время этим утром, играя с boto, и я думаю, что у меня есть решение, которое работает с SimpleDB. Вам нужен последний выпуск boto, чтобы поддерживались условные и последовательные чтения.
Пример кода здесь: http://pastebin.com/3XzhPqfY
Пожалуйста, публикуйте комментарии/предложения. Я считаю, что этот код должен быть достаточно безопасным - мой тест в main() проверяет его на 10 потоков.
Одна вещь, которую я не рассматривал, заключается в том, что чтение S3 не является согласованным (правильно?), поэтому теоретически поток может работать на старой копии значения S3. Похоже, что может быть обходной путь для этого, как описано здесь:
http://www.shlomoswidler.com/2009/12/read-after-write-consistency-in-amazon.html
Ответ 2
Я не думаю, что вы можете сделать это, используя только S3, используя улучшения простой консистенции, как сказал Джеймс, это хороший способ, который работает
вы можете найти несколько примеров здесь: Amazon SimpleDB Consistency Enhancements
другой подход, который может быть хорош, заключается в использовании функции версии S3
поэтому в основном, храните пару id id id версии в simpleDB как самую "действительную" версию
и убедитесь, что все запросы GET будут извлекать эту версию
после успешного PUT измененного объекта обновите идентификатор версии в БД
таким образом, вы также можете использовать возможность извлечения предыдущих версий объекта для восстановления при необходимости.