Подтвердить что ты не робот

Блокировка с помощью S3

Какой рекомендуемый способ реализовать простой механизм блокировки, который будет использоваться в сочетании с S3?

Пример того, что я хочу сделать:

  • получить блокировку по id объекта
  • читать объект из S3
  • изменить данные
  • записать объект в S3
  • блокировка релиза

Идеально ищет механизм блокировки на основе облаков. Я мог бы использовать memcached локально, но тогда мне приходится иметь дело с масштабированием. Я не вижу очевидного способа реализовать легкую блокировку с любыми API AWS, но это кажется общей проблемой.

Интересно, можете ли вы использовать SimpleDB для выполнения операции захвата атома. Кто-нибудь пробовал это?

4b9b3361

Ответ 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 измененного объекта обновите идентификатор версии в БД

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