2010-08-07 3 views
21

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

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

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

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

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

ответ

10

Хорошо, я провел некоторое время этим утром, играя с boto, и я думаю, что у меня есть решение, которое работает с SimpleDB. Вам нужен последний выпуск boto, чтобы поддерживались условные и последовательные чтения.

Пример кода здесь: http://pastebin.com/3XzhPqfY

Пожалуйста отправлять комментарии/предложения. Я считаю, что этот код должен быть достаточно безопасным - мой тест в main() пытается использовать его с 10 потоками.

Я не обращал внимания на то, что чтение S3 несовместимо (правильно?), Поэтому теоретически поток может работать на старой копии значения S3. Похоже, что там может быть обходной путь для этого, как описано здесь:

http://www.shlomoswidler.com/2009/12/read-after-write-consistency-in-amazon.html

+0

SimpleDB теперь устарел; он упал с консоли AWS и больше не входит в их «Услуги и решения». Была ли реализация, использующая DynamoDB? :) – pjz

2

я не думаю, что вы можете сделать это с помощью S3 только с помощью улучшения согласованности SimpleDb как сказал Джеймсу это хороший способ, который работает

вы можете посмотреть некоторые примеры здесь: Amazon SimpleDB Consistency Enhancements

другой подход, который может быть штраф с помощью versioning feature из S3
поэтому в основном, хранить идентификатор пару идентификатор объекта/версии в SimpleDb как наиболее «действительный» VERSI на
и убедитесь, что все запросы GET будут извлекать эту версию
после успешного PUT измененного объекта, обновите идентификатор версии в DB

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

Смежные вопросы