2010-06-18 2 views
1

Я знаю Rails.cacheActiveSupport::Cache::MemoryStore, и это не потокобезопасность.Почему Rails.cache не является потокобезопасным?

Я не понимаю, почему рельсы используют небезопасный кеш-поток по умолчанию? Почему бы не использовать ActiveSupport::Cache::SynchronizedMemoryStore? На мой взгляд, на веб-сайте, если кеш не является потокобезопасным, он почти бесполезен, потому что запросы не обрабатываются в ОДНОМ потоке.

Вы используете Rails.cache в вашем webapp? И как вы его используете?

+0

Я знаю, что это старый вопрос, пытаясь помочь остановить погоню за дикими гусями. Проблемы безопасности потоков в MemoryStore, по-видимому, были исправлены, и SynchronizedMemoryStore устарел. [https://github.com/rails/rails/commit/ee51b51b60f9e6cce9babed2c8a65a14d87790c8] –

ответ

4

Кэш-память по умолчанию в Rails - ActiveSupport::Cache::FileStore, а не MemoryStore.

Магазин памяти ограниченно использует на практике, поскольку он ограничен одним процессом, что делает его бесполезным для приложений Rails, которые развертываются с использованием Пассажира или кластера Mongrel, где запросы обрабатываются отдельными процессами, а не отдельными потоки.

Для приложений малого и среднего размера вы, вероятно, отлично справитесь с хранилищем файлов по умолчанию. Если вам нужно масштабироваться дальше, вы должны посмотреть на ActiveSupport::Cache::MemCacheStore.

+0

спасибо за ваш ответ. Я был разработчиком Java, и я думал, что рельсы похожи на Java, один процесс и множество потоков. Вы имеете в виду, что когда приходит запрос, есть ровно один процесс (так один поток) для его обработки? Если я хочу кэш глобуса, я должен рассмотреть другой продукт кеша, например «memcached»? – Freewind

+0

@Freewind: Существует несколько процессов, но каждый процесс обрабатывает только один запрос за раз. Я предлагаю начать с кеша «FileStore». Это глобальный кеш, который обычно не требует дополнительной настройки, поэтому с ним легко начать работу. Вы можете всегда переключиться на «memcached» позже, если возникнет такая необходимость, но поскольку для этого требуется дополнительная настройка (вам нужно поддерживать сервер «memcached»), проще начать с «FileStore» и перейти только к «memcached» позже, если вам нужно. –

2

Большинство сценариев развертывания для Rails на самом деле однопоточные. Параллелизм достигается путем нереста нескольких процессов, автоматически или заранее. Для многих людей безопасность потоков не будет иметь большого значения.

Многопоточные варианты существуют (особенно с JRuby), поэтому ваш вопрос по-прежнему действителен. Именно поэтому в Rails 3 старый ActiveSupport::Cache::MemoryStore был удален и заменен ActiveSupport::Cache::SynchronizedMemoryStore, что делает его потокобезопасным по умолчанию.

Если вам нужна безопасность потоков в приложении Rails 2, поместите следующее в вашу среду.

ActionController::Base.cache_store = :synchronized_memory_store 
+1

@Freewind: Да, это так. Как и мы с малмом, запросы обычно обрабатываются в отдельных процессах. Часто у вас есть пул рабочих процессов, и каждый новый запрос переходит к первому процессу, который не занят другим запросом. Так что да, если вы хотите использовать глобальный кеш, например, «FileStore» или «MemCacheStore», которые работают в разных процессах. –

+0

Спасибо вам большое, я получаю это :) – Freewind

0

Кэш по умолчанию Rails (ActiveSupport :: Cache MemoryStore) потокобезопасно от Rails версии 3.1: http://api.rubyonrails.org/v3.1.0/files/activesupport/CHANGELOG.html Как CHANGELOG примечания: «Сделайте поточно так, что реализация кэша по умолчанию, используемый Rails является безопасный поток. "

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