2. Зачем нужен Queue API
• Пакетная обработка
• Выполнение отложенных операции
предотвратить блокировку API сервисами
распределить нагрузку
• Импорт в определенной
последовательности
5. Типы Очередей Reliable и Non Reliable
/modules/system/system.queue.inc
Reliable
место хранения: БД
время жизни: несколько запросов
class BatchQueue extends SystemQueue
class SystemQueue implements DrupalReliableQueueInterface
interface DrupalReliableQueueInterface extends DrupalQueueInterface
Non-Reliable
место хранения: память
время жизни: один запрос
class BatchMemoryQueue extends MemoryQueue
class MemoryQueue implements DrupalQueueInterface
6. Как работать с Queue API
public DrupalQueueInterface::createQueue() {…}
public DrupalQueue::get()
public DrupalQueueInterface {
public function createItem($data) {…}
public function claimItem ($lease_time = 3600) {…}
public function deleteItem($item) {…}
}
12. Спасибо за внимание
• 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
Я бы хотел поговорить немного о том, что такое очереди,где икак они используются в 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 – для кэширования и создания экземпляров очереди.
Для подготовки к докладу использовались другие презентации, они более подробные и если кого то заинтересовала эта тема, то советую ознакомится с этим ссылками.