SlideShare una empresa de Scribd logo
1 de 13
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.inc
Reliable
 место хранения: БД
 время жизни: несколько запросов
                                                 class BatchQueue extends SystemQueue
                             class SystemQueue implements DrupalReliableQueueInterface
                     interface DrupalReliableQueueInterface extends DrupalQueueInterface



Non-Reliable
 место хранения: память
 время жизни: один запрос
                                        class BatchMemoryQueue extends MemoryQueue
                                   class MemoryQueue implements DrupalQueueInterface
Как работать с Queue API
public DrupalQueueInterface::createQueue() {…}

public DrupalQueue::get()
public DrupalQueueInterface {
        public function createItem($data) {…}
        public function claimItem ($lease_time = 3600) {…}
        public function deleteItem($item) {…}
}
Queue example module
http://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 8
core/includes/common.inc


Queue()
Core/lib/Drupal/Core/Queue

Batch
BatchMemory
DatabaseQueue
Memory
QueueDatabaseFactory
QueueFactory
QueueInterface
ReliableQueueInterface
Спасибо за внимание
• 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()

Más contenido relacionado

Destacado

Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologie
contentrepublic
 

Destacado (14)

An introduction to digital health surveillance from online user-generated con...
An introduction to digital health surveillance from online user-generated con...An introduction to digital health surveillance from online user-generated con...
An introduction to digital health surveillance from online user-generated con...
 
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 |  Shazam, Alexey OvcharovTargetSummit Moscow Late 2016 |  Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
 
Patch Management
Patch ManagementPatch Management
Patch Management
 
Piezoelectric sens0 r
Piezoelectric sens0 rPiezoelectric sens0 r
Piezoelectric sens0 r
 
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
 
Проект "Збережемо природу разом"
Проект   "Збережемо природу разом" Проект   "Збережемо природу разом"
Проект "Збережемо природу разом"
 
Measuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivityMeasuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivity
 
Friction in orthodontics
Friction in orthodonticsFriction in orthodontics
Friction in orthodontics
 
Saliva (2)
Saliva (2)Saliva (2)
Saliva (2)
 
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview MistakesJoseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
 
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
 
Feasibility study format
Feasibility study formatFeasibility study format
Feasibility study format
 
[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams
 
Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologie
 

Más de DrupalSPB

Más de DrupalSPB (20)

Мониторинг Drupal-сайтов
Мониторинг Drupal-сайтовМониторинг Drupal-сайтов
Мониторинг Drupal-сайтов
 
Если не Drupal 8, то что? Обзор Laravel 5
Если не Drupal 8, то что? Обзор Laravel 5Если не Drupal 8, то что? Обзор Laravel 5
Если не Drupal 8, то что? Обзор Laravel 5
 
Headless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и ReactHeadless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и React
 
Проблематика взаимодействия между исполнителем и заказчиком
Проблематика взаимодействия между исполнителем и заказчикомПроблематика взаимодействия между исполнителем и заказчиком
Проблематика взаимодействия между исполнителем и заказчиком
 
Кто такой хороший Drupal-разработчик
Кто такой хороший Drupal-разработчикКто такой хороший Drupal-разработчик
Кто такой хороший Drupal-разработчик
 
Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7
 
Темизация и Twig в Drupal 8
Темизация и Twig в Drupal 8Темизация и Twig в Drupal 8
Темизация и Twig в Drupal 8
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиков
 
Drupal 8 и хостинг
Drupal 8 и хостингDrupal 8 и хостинг
Drupal 8 и хостинг
 
Знакомство с Drupal 8
Знакомство с Drupal 8Знакомство с Drupal 8
Знакомство с Drupal 8
 
Никита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗНикита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗ
 
Василий Устинов - Drupal + Drush
Василий Устинов - Drupal + DrushВасилий Устинов - Drupal + Drush
Василий Устинов - Drupal + Drush
 
Олег Сосорев - Эффективное формирование и расширение архитектуры ПО
Олег Сосорев - Эффективное формирование и расширение архитектуры ПООлег Сосорев - Эффективное формирование и расширение архитектуры ПО
Олег Сосорев - Эффективное формирование и расширение архитектуры ПО
 
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
 
Андрей Юртаев - Improve theming with (Twitter) Bootstrap
Андрей Юртаев - Improve theming with (Twitter) BootstrapАндрей Юртаев - Improve theming with (Twitter) Bootstrap
Андрей Юртаев - Improve theming with (Twitter) Bootstrap
 
Никита Ремизов - Случай использования Drupal как ERP системы
Никита Ремизов - Случай использования Drupal как ERP системыНикита Ремизов - Случай использования Drupal как ERP системы
Никита Ремизов - Случай использования Drupal как ERP системы
 
Павел Прищепа - Drupal хостинг полного цикла
Павел Прищепа - Drupal хостинг полного циклаПавел Прищепа - Drupal хостинг полного цикла
Павел Прищепа - Drupal хостинг полного цикла
 
Чингис Санданов - Drupal как решение для госсектора
Чингис Санданов - Drupal как решение для госсектораЧингис Санданов - Drupal как решение для госсектора
Чингис Санданов - Drupal как решение для госсектора
 
Алексей Колосов - Drupal для хостинга
Алексей Колосов - Drupal для хостингаАлексей Колосов - Drupal для хостинга
Алексей Колосов - Drupal для хостинга
 
Развитие идеи Проекта Мечты
Развитие идеи Проекта МечтыРазвитие идеи Проекта Мечты
Развитие идеи Проекта Мечты
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 

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

  • 1. Drupal 7 Работа с очередями
  • 2. Зачем нужен Queue API • Пакетная обработка • Выполнение отложенных операции предотвратить блокировку API сервисами распределить нагрузку • Импорт в определенной последовательности
  • 3. Где реализуется Queue API Update Batch module API Queue API Aggregator module Cron
  • 4. Очередь Queue table
  • 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) {…} }
  • 7. Queue example module http://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);
  • 8. Пример работы 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); } }
  • 9. 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)); }
  • 11. Queue API – Drupal 8 core/includes/common.inc Queue() Core/lib/Drupal/Core/Queue Batch BatchMemory DatabaseQueue Memory QueueDatabaseFactory QueueFactory QueueInterface ReliableQueueInterface
  • 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
  • 13. Вопросы 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()

Notas del editor

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