队列

admin 提交于 周三, 06/07/2023 - 15:21

队列

Drupal Queue API 允许把一系列任务预先放到一个队列中,稍后再一一处理,系统会通过一个策略来尝试保证, 队列中的单个任务在同时刻只被单一的消费客户端消费。

  • Drupal\Core\Queue\QueueInterface::createQueue() 创建一个新的队列。
  • Drupal\Core\Queue\QueueInterface::createItem() 为一个队列添加任务项。
  • Drupal\Core\Queue\QueueInterface::claimItem($lease_time = 3600) 取得一个任务在一定时间内的处理权。
  • Drupal\Core\Queue\QueueInterface::deleteItem() 任务处理完成后删除任务项。
  • Drupal\Core\Queue\QueueInterface::releaseItem() 任务无法处理,释放任务项。

队列分为两种实现:可靠队列非可靠队列。 前者会保证入列消息的处理顺序,每个消息至少被处理一次。 后者只会尽最大努力,但不能保证。 Drupal core 对应的默认实现分别是 DatabaseQueueMemory

可以在 setting.php 文件中配置指定的队列名称所使用的队列实现服务。

  • queue_reliable_service_$name: The container service to use for the reliable queue $name.
  • queue_service_$name: The container service to use for the queue $name.
  • queue_default: The container service to use by default for queues without overrides. This defaults to 'queue.database'.

假如打算创建一个名为 my_queue 的队列,可以有如下配置:

$settings['queue_reliable_service_my_queue'] = 'queue.database';
$settings['queue_service_my_queue'] = 'queue.memory';
$settings['queue_default'] = 'queue.database';

Drupal::queue('my_queue', true); 将使用 queue.database 实现, Drupal::queue('my_queue', false); 将使用 queue.memory 实现。 任何其他名字,如 Drupal::queue('xxx');,都将会默认使用 queue.database 实现。

Advanced Queue