Я использую плагин QueueWorker для обновления/создания узла в фоновом режиме. На локальном уровне проблем нет, он завершает весь процесс очереди.Однако на сервере aws он обычно останавливается в какой-то момент.
Я предполагаю из-за потребления ресурсов на сервере. Каков идеальный способ оптимизации моего QueueWorker?
Вот мой код:
$ смещение = 0;
пока (ИСТИНА) {
$nodes= \Drupal::entityQuery('узел')->условие('тип', 'статья')->диапазон($смещение, $лимит)->выполнить();
$смещение = $смещение + $лимит;
если (пусто($узлы)) {
сломать;
}
// Инициализировать ОЧЕРЕДЬ
$queue_manager = \Drupal::service('plugin.manager.queue_worker');
$queue_worker = $queue_manager->createInstance('ex_queue');
$queue = $this->queueFactory->get('ex_queue');
// Создаем элементы ОЧЕРЕДИ
foreach ($nodes как $node) {
$item = новый \stdClass();
$item->content = $узел;
$queue->createItem($item);
}
// Выполнить элементы ОЧЕРЕДИ
в то время как ($item = $queue->claimItem()) {
пытаться {
$queue_worker->processItem($item->данные);
$queue->deleteItem($item);
}
поймать (RequeueException $e) {
$queue->releaseItem($item);
\Drupal::logger('system')->warning('RequeueException');
}
поймать (SuspendQueueException $e) {
$queue->releaseItem($item);
\Drupal::logger('system')->error('SuspendQueueException');
}
поймать (\ Исключение $e) {
$queue->releaseItem($item);
\Drupal::logger('система')->error('Исключение');
}
}
}
и мой QueueWorker
/**
* @QueueWorker(
* id = "бывшая_очередь",
* title = @Translation("Ex Processor"),
* cron = {"время" = 3600}
* )
*/
класс ExQueueProcessor расширяет QueueWorkerBase, реализует ContainerFactoryPluginInterface {
защищенная конфигурация $;
/**
* {@inheritdoc}
*/
общедоступная функция __construct (конфигурация массива $) {
$this->configuration = $configuration;
}
/**
* {@inheritdoc}
*/
общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
вернуть новую статику(
$конфигурация
);
}
/**
* {@inheritdoc}
*/
публичная функция processItem($item) {
// заниматься вещами
}
Допустим, общее количество $nodes составляет 17 000 элементов, и оно останавливается на отметке 15 000. Есть ли способ оптимизировать это, чтобы он мог обрабатывать большие данные?