• Save
DrupalCafe #3: Никита Ремизов - Drupal 7 - Работа с очередями
Upcoming SlideShare
Loading in...5
×
 

DrupalCafe #3: Никита Ремизов - Drupal 7 - Работа с очередями

on

  • 766 views

Никита Ремизов - Drupal 7 - Работа с очередями

Никита Ремизов - Drupal 7 - Работа с очередями
Событие: DrupalCafe #3
Дата: 02.03.2013

Statistics

Views

Total Views
766
Views on SlideShare
709
Embed Views
57

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 57

http://drupalspb.org 57

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Я бы хотел поговорить немного о том, что такое очереди,где икак они используются в Drupal. Продемонстрировать каким образом возможно использовать систему очередей в собственном модуле.
  • Зачем же вообще нужны очереди, откуда они берутся? В каких задачах может потребоваться использовать систему очередей?1. В случаях когда требуется пакетная обработка данных. Т.е. требуется выполнение сразу нескольких действий, то возможно поместить эти элементы в очередь, используя Batch API. Кто использовать Batch API знает метод batch_set($operation), где в качестве аргумента передается информация о действиях, которые необходимо выполнить.Например, мы хотим при создании ноды одного типа, создать еще несколько дополнительных нод другого типа.2. Требуется в случая обработки большого кол-ва информации, например обработать статистическую информацию, количество заказов в интернет магазине по всем продуктам. Мы бы могли использовать систему очередей для того, чтобы разбить задачу по частям и выбрать оптимальное время для выполнения операции. Поскольку система позволяет откладывать операции, то как следствие её можно использовать для предотвращения банаAPI сервисами – типоTwitter API, распределяя кол-во выполненных запросов.// На прошлом DrupalCafeдокладчик (Виктор Григорьев) рассказывал о создании модуля, в котором //производилось обновление перевода всех модулей сайта, задачу такого рода тоже можно решить с //помощью очередей, разбив задачу по частям и распределив нагрузку.3. С помощью очередей можно соблюдать строгую последовательность выполняющихся задач. Т.о. можно быть уверенным что вы сможете импортировать словарь таксономией с иерархией, потому что родительский термин будет добавлен раньше, чем связанные с ним термины.(посчитать сколько сотрудников работает на проекте. Или предположим мы хотим раз в неделю информировать всех пользователей нашего супер посещаемого сайта, о новых статья за неделю. )
  • И так где же реализуется работа с очередями в Drupal.Batch API – построен на основе Queue API, и предоставляет модифицированные классы очередей, о нем я уже упомянул.Cron – использует Queue API, позволяют другим модулям с помощью хуков добавлять собственные элементы очередей и обрабатывать их. В свою очередь эти хуки использует модуль аггрегатор для обновления RSS лент, и именно основываясь на этих хуках позже я покажу как сделать простейший модуль.Модуль Обновлений, создает очередь из задач на сбор информации об обновлениях.Давайте теперь определимся, что же мы понимаем здесь очередью.
  • О́чередь — структура данных, (с правилам доступа) с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, FirstIn — FirstOut). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.В Drupalэлементы Системной Очереди хранятся в таблице queue, но не для всех очередей это справедливо. (что не обязательно, если вы используете пользовательский класс очереди, которые могут хранить свои данные в папке или своей таблице или Non-reliable очереди, которые хранятся в памяти)Таблица состоит из 5 колонок, ID, имя очереди, данные в произвольной форме, необходимой для выполнения задачи, а также метки времени создания и снятия блокировки (аренды)
  • Почему же не все очереди хранятся в этой таблице?В drupalсуществует два типа очереди надежнаяи не надежная. Главные отличия заключаются в том, что надежная очередь хранит свои элементы в базе данных, а не надежная нет. И как следствие надежная очередь может проходить через несколько запросов, а не надежная обрабатывает все элементы за один.Надежная очередь гарантирует, что каждый элемент будет обработан хотя бы один раз и сохраняет порядок очереди. Не надежная может не соблюдать порядка, а так же может потерять часть элементов, но поскольку запись идет в память то она может справиться с гораздо большим количеством инсертов.Примерами классов надежной очереди является:SystemQueueBatchQueueЕдинственным способом показать Druapal, что ваш пользовательский класс создает надежную очередь, это использовать DrupalReliableQueueInterfaceНе надежные:MemoryQueueBatchMemoryQueue
  • Рассмотрим основные методы интерфейса DrupalQueueInterfaceсоздание очереди, этот метод вызывается при инициализации очереди, создает таблицы и папки куда будут записываться элементы очереди.Для добавления элемента в очередьиспользуем createItem, где аргументом функции являются данные в произвольной форме, которые будут связаны с задачей в очереди.Далее методclaimItem, который утверждает элемент на обработку и в качестве аргумента функции, выступает время аренды, т.е. это время которое предоставляется обработчику элемента, после которого элемент будет предоставлен другому обработчику или удален. Последний метод – удаление элемента, аргументов является элемент для удаления, после возврата claimItem.Для получения объекта очереди используем класс DrupalQueue c единственным публичным статическим методом get().
  • Давайте наглядно посмотрим как работа с этими методами выглядит в базе данных. Для этих целей я установил модуль queue example module, который очень хорошо иллюстрирует эти методы. И так, мы можем создать запись в очереди, давайте так и сделаем. Видите в таблице queue – появилась наша запись. Теперь представим, что некоторый процесс хочет обработать данный элемент, тогда он должен забронировать его, мы можем здесь выбрать время за которое планируется выполнение операции. После выполнения, которого элемент в очереди удаляется.
  • Задача;Создана нода типа Проект и нода типа Анкета. В проекте хранится фактическое кол-во человек работающих на проекте. Анкета имеет поле – статус, нам необходимо учитывать только анкеты со статусом сотрудники связанных с проектом.Нам надо посчитать сколько анкет имеют статус – сотрудник, на каждом проекте, после чего записать новое значение фактического количества сотрудников на проекте и создать ревизию проектов. Для этого воспользуемся хуками hook_cronи hook_cron_queue_info.Два этих хука вызваются внутри функции drupal_cron_run, первым делом модули опрашиваются на наличие хука hook_cron_queue. Он должен вернуть массив, описывающий пользовательскую очередь, а именно обработчик элементов очереди и время, которое Drupal Должен потратить на работу в обработчике элементов. В моем случае обработчик имеет название update_project_staff_infoи время на выполнение 15 секунд.Далее управление передается hook_cron, в котором я получаю информацию о проектах и сотрудниках на них, после чего записываю это информацию в очередь, каждый проект это один элемент очереди. Далее drupal_cron_run()получает объект моей пользовательской очереди, и начинает обрабатывать элементы моей очереди удаляя, полученный элемент
  • Так выглядит обработчик элементов очереди, на вход функции подается элемент очереди. Здесь и происходит создание ревизии ноды.Вот и все, так просто, в результате мы можем работать с этой статистической информацией, например видеть текучесть персонала на проекте с течение времени… смотри erp.retail-spb.ru
  • Модули улучшающиеQueueJob Scheduler – Дополнительное APIElysiaCron – Интерфейс для ОчередейQueue UI – просмотр очередей
  • ВDrupal 8 основные методы работы с очередями останутся такими же, но API будет уже храниться в Core/lib/Drupal/Core/Queue. В файле core/includes/common.inc будет хранится только функция queue – для кэширования и создания экземпляров очереди.
  • Для подготовки к докладу использовались другие презентации, они более подробные и если кого то заинтересовала эта тема, то советую ознакомится с этим ссылками.

DrupalCafe #3: Никита Ремизов - Drupal 7 - Работа с очередями DrupalCafe #3: Никита Ремизов - Drupal 7 - Работа с очередями Presentation Transcript

  • Drupal 7Работа с очередями
  • Зачем нужен Queue API• Пакетная обработка• Выполнение отложенных операции предотвратить блокировку API сервисами распределить нагрузку• Импорт в определенной последовательности
  • Где реализуется Queue API Update Batch module API Queue API Aggregator module Cron
  • Очередь Queue table
  • Типы Очередей Reliable и Non Reliable/modules/system/system.queue.incReliable место хранения: БД время жизни: несколько запросов class BatchQueue extends SystemQueue class SystemQueue implements DrupalReliableQueueInterface interface DrupalReliableQueueInterface extends DrupalQueueInterfaceNon-Reliable место хранения: память время жизни: один запрос class BatchMemoryQueue extends MemoryQueue class MemoryQueue implements DrupalQueueInterface
  • Как работать с Queue APIpublic DrupalQueueInterface::createQueue() {…}public DrupalQueue::get()public DrupalQueueInterface { public function createItem($data) {…} public function claimItem ($lease_time = 3600) {…} public function deleteItem($item) {…}}
  • Queue example modulehttp://drupal.org/project/examplesДемонстрация:http://localhost/tests/drupalcafe3/queue_example/insert_remove Insert: $queue->createItem($form_state[values][string_to_add]); Claim: $item = $queue->claimItem($form_state[values][claim_time]); Delete: $queue->deleteItem($item);
  • Пример работыfunction drupal_cron_run() { module_invoke_all(‘cron_queue_info’); module_implements(‘cron’); // and invoke Анкета Проект ……………………. - Статус =$queue = DrupalQueue::get($queue_name); - Факт ‘Сотрудник’while (time() < $end && ($item = $queue->claimItem())) { $function($item->data); $queue->deleteItem($item);}}/** /** * Implements hook_cron_queue_info(). * Implements hook_cron(). */ */function project_plans_cron_queue_info() { function project_plans_cron() { $queues[update_project_staff_info] = array( $interval = variable_get(project_plans_cron_interval, 60 * 60 * 24*14); worker callback => update_project_staff_info, if (time() >= variable_get(project_plans_cron_next_ex, 0)) { time => 15, $projects = project_api_projects_list(); ); $queue = DrupalQueue::get(update_project_staff_info); return $queues; foreach ($projects as $project_nid) {} $result = project_api_project_i($project_nid); $queue->createItem($result[$project_nid]); } variable_set(project_plans_cron_next_ex, time() + $interval); } }
  • function update_project_staff_info($project_info) { $node = node_load($project_info->nid); $node->project_m_plan[LANGUAGE_NONE][0][value] = $project_info->PLAN; $node->project_m_fact[LANGUAGE_NONE][0][value] = $project_info->FACT; $node->project_m_route[LANGUAGE_NONE][0][value] = $project_info->ROUTE; // Make this change a new revision $node->revision = 1; $node->log = t(This node :node was programmatically updated at :date by project_plans module. Staff fact number - :fact. Staff plan number - :plan. Roate of staff - :route, array( :node => $project_info->nid, :date => date(c), :plan => $project_info->PLAN, :fact => $project_info->FACT, :route => $project_info->ROUTE, )); node_save($node); watchdog(content, @type: for %title node(:nid) was created a new revision., array(@type => $node->type, :nid => $node->nid, %title => $node->title));}
  • Демонстрацияhttp://erp.retail-spb.ru/project/geyzer-regiony
  • Queue API – Drupal 8core/includes/common.incQueue()Core/lib/Drupal/Core/QueueBatchBatchMemoryDatabaseQueueMemoryQueueDatabaseFactoryQueueFactoryQueueInterfaceReliableQueueInterface
  • Спасибо за внимание• http://www.ent.iastate.edu/it/Batch_and_Queue.pdf• http://www.hashbangcode.com/blog/drupal-7-queues-api-579.html• http://rbayliss.net/drupal-queue-api
  • Вопросыpublic DrupalQueueInterface::createQueue()public DrupalQueue::get()public DrupalQueueInterface::createItem($data)public DrupalQueueInterface::claimItem ($lease_time = 3600)public DrupalQueueInterface::deleteItem($item)hook_cron()hook_cron_queue_info()