Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как применять Memcached с Ruby on Rails в Ubuntu 12.04 LTS

Anna | 20.06.2014 | нет комментариев

Memcached — система для кэширования объектов в памяти, которая работает дюже стремительно. Применение Memcached может гораздо увеличить скорость работы Rails-приложения с минимальными расходами.
Заблаговременные данные
Предполагается, что в вашей системе теснее установлены Ruby on Rails и Memcached. Если это не так, то вам помогут ссылки, приведенные ниже:

Также предполагается, что у вас есть запущенное Rails-приложение, которое вы планируете оптимизировать с поддержкой Memcached.

Установка гема «Dalli»

Первое, что мы обязаны сделать — это установить гем Dalli от Mike Perham:

gem install dalli

Если вы используете Bundler, то добавьте строку gem ‘dalli’ в Gemfile и исполните установку bundle install.
Дальше мы проделаем дюже короткий путь по настройке взаимодействия Rails и Memcached.

Конфигурирование Rails

В первую очередь, для настройки взаимодействия Rails и Memcached нужно отредактировать файлconfig/environments/production.rb. Добавим следующую строку, которая указывает Rails применять для кэширования Dalli:

config.cache_store = :dalli_store

В данный же файл добавим еще одну строку, которая разрешает ActionController исполнять кэширование:

config.action_controller.perform_caching = true

Теперь самое время исполнить перезагрузку вашего Rails-приложения для типичной последующей работы.

Настройка Rails-приложения

Нам нужно исполнить настройку Rails-приложения для последующей работы с Memcached. Есть два основных метода настройки и о них мы побеседуем ниже.

Добавление заголовков (Cache-Control) для управления кэшем

Самый примитивный метод заключается в добавлении заголовков (Cache-Control) для управления кэшем к одному из ваших экшенов. Это дозволит Rack::Cache сберегать итог работы экшена в Memcached. В этом случае экшен в app/controllers/slow_controller.rb должен содержать следующее:

def slow_action
  sleep 15
  # todo - print something here
end

Вы также можете добавить следующую строку, Дабы позволить Rack::Cache беречь итог в течении пяти минут:

def slow_action
  expires_in 5.minutes
  sleep 15
  # todo - print something here
end

Сейчас, когда вы исполните данный экшен вторично, то обязаны подметить, что скорость работы гораздо усилилась. Rails будет исполнять код экшена только один раз в пять минут для обновления Rack::Cache.
Обратите внимание на то, что Cache-Control заголовки будут общедоступными. Если у вас есть экшены, которые обязаны быть видны лишь определенным пользователям, то используйте expires_in 5.minutes, :public => false. Вы также обязаны определить особенно оптимальное время кэширования для вашего приложения. Для всякого из приложений это оптимальное время может быть различным и должно быть определено опытным путем.

Подробнее об HTTP-кэшировании дозволено прочитать в статье Mark Nottingham Начальство по кэшированию для веб-авторов и вебмастеров.

Хранение объектов в Memcached

Если в ваших экшенах имеются дюже ресурсоемкие операции либо вы оперируете объектами, которые по каким-то причинам нужно Зачастую создавать, то осмысленно будет беречь промежуточный итог в Memcached. Возможен, что ваш экшен содержит дальнейший код:

def slow_action
  slow_object = create_slow_object
end

Вы можете сберечь итог в Memcached дальнейшим образом:

def slow_action
  slow_object = Rails.cache.fetch(:slow_object) do
    create_slow_object
  end
end

В этом случае Rails будет запрашивать у Memcached объект с ключом ‘slow_object’. Если объект теснее существует (был ранее сохранен в память), он будет возвращен. В отвратном случае, выполнится содержимое блока и итог запишется в ‘slow_object’.

Кэширование фрагментов

Кэширование фрагментов — это одна из особенностей Rails, разрешающая кэшировать самые динамичные (Зачастую меняющиеся) части вашего приложения. Вы можете кэшировать всякие части ваших видов, заключая их в блок cache:

<% # app/views/managers/index.html.erb  %>
<% cache manager do %>
  Manager s Direct Reports:
  <%= render manager.employees %>
<% end %>

<% # app/views/employees/_employee.html.erb %>
<% cache employee do %>
    Employee Name: <%= employee.name %>
    <%= render employee.incomplete_tasks %>
<% end %>

<% # app/views/tasks/_incomplete_tasks.html.erb %>
<% cache task do %>
    Task: <%= task.title %>
    Due Date: <%= task.due_date %>
<% end %>

Данная техника кэширования именуется, как Русские матрешки. Rails будет кэшировать все эти фрагменты в Memcached. С тех пор, как мы добавили имя модели в качестве параметра вызова способа cache, ключи этих моделей в кэше будут меняться лишь тогда, когда модель будет изменяться. Эта задача будет исключительно востребованной, если нам необходимо обновить модель «task»:

@task.completed!
@task.save!

Выходит, мы имеем вложенный кэш объектов и Rails ничего не знает о сроке жизни кэша фрагментов, привязанных к моделям. В этом случае нам поможет ключ ActiveRecord touch:

class Employee < ActiveRecord::Base
  belongs_to :manager, touch: true
end

class Task < ActiveRecord::Base
  belongs_to :employee, touch: true
end

Сейчас, когда модель Task будет обновлена, кэш станет недействительным для фрагментов и моделиEmployee будет извещено, что она также должна обновить свои фрагменты. Дальше, модель Employeeизвестит модели Manager, что она тоже должна обновить свой кэш. Позже этого процесс обновления кэша дозволено считать удачно законченным.

Существует еще одна добавочная задача кэширования по типу «Русских матрешек»: при развертывании нового приложения Rails не знает, когда необходимо проверять обновление вида. Возможен, вы обновили «task» дальнейшим образом:

<% # app/views/tasks/_incomplete_tasks.html.erb %>
<% cache task do %>
    Task: <%= task.title %>
    Due Date: <%= task.due_date %>
    <p><%= task.notes %></p>
<% end %>

Rails не может обновлять кэш фрагментов при применении частичных образцов. Ранее, Дабы обойти эту задачу, нужно было добавлять номер версии в способ cache. Теперь эту задачу дозволено решить с применением гема cache_digests, тот, что механически добавляет MD5-хэш к ключу кэша. Позже обновления частичного образца и перезапуска приложения ключ кэша также обновится и Rails будет вынужден исполнить новую генерацию образца вида. Он также может обрабатывать зависимости между файлами образцов таким образом, что если, возможен, был изменен частичный образец _incomplete_tasks.html.erb, то будут обновлены все зависимые образцы по цепочке вверх.

Эта специфика была учтена в Rails 4.0. Если вы используете больше раннюю версию, то нужно установить гем, применяя команду:

gem install cache_digests

Если вы используете Bundler, то добавьте следующую строку в Gemfile:

gem 'cache_digests'

Расширенная настройка Rails и Memcached

Гем «Dalli» является дюже сильным решением и предоставляет вероятность работы с ключами в кластере Memcached серверов. Он может распределять нагрузку, тем самым увеличивая потенциал Memcached. Если у вас есть несколько серверов, то вы можете установить на всяком из них Memcached, а после этого добавить соответствующую настройку в файл конфигурации config/environments/production.rb:

config.cache_store = :dalli_store, 'web1.example.com', 'web2.example.com', 'web3.example.com'

Данная настройка дозволит применять consistent hashing для разделения ключей между доступными Memcached серверами.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB