已发布/队列和作业

此包最新版本(dev-master)没有可用的许可证信息。

dev-master / 0.1.x-dev 2018-10-15 18:03 UTC

This package is auto-updated.

Last update: 2024-09-29 04:53:36 UTC


README

这不是一个消息队列!

队列和作业是一个用于构建可扩展应用的框架。通过将重负载和风险操作异步地在单独的线程中执行来达到可扩展性。

队列

队列添加了简单的移动到后台功能,这在许多情况下可能很有用。在现代社会,大多数操作都可以异步进行,而什么可以异步,就必须异步。

案例 1: 购物车

当用户点击结账购物车时,这并不意味着订单必须在同一秒内下单。相反,我们可以将购物车标记为正在处理,并计划在后台执行结账任务。用户通常不会注意到同步和异步结账之间的区别,但如果同步过程中结账过程中出现错误,用户会看到错误,客户可能会丢失,而在异步方式中,失败的作业可以重试,只会导致订单处理延迟。这也是不好的,但不如丢失购物车那么关键。

案例 2: 业务流程

当你有一个复杂依赖外部服务的业务流程时,你可能因为单个步骤失败而导致整个流程失败。为了解决这个问题,你可能将流程分解为独立的步骤,并依次或并行执行每个步骤。

例如,让我们以卡片结账为例,对于每个项目,你需要报价、在合作伙伴服务上验证订单,如果一切正常,则下订单并通知合作伙伴服务。

如果你在同一线程中执行所有操作,每个步骤都可能因为第三方API的暂时问题而破坏系统,你必须准备好重启进程(通过丢失以前的报价)或捕获它中断的地方。

相反,你可以为每个操作计划一个任务,依次执行。当任何步骤失败时,你只需简单地重新启动它(如果不是自动完成的),流程就像什么都没发生一样继续。

配置

released_queue:
    transport: db # db / amqp / inline
    template: ::base.html.twig  # optional  
    doctrine.orm.default_entity_manager: default # optional
    server_id: (Optional unique server identifier - must be set if a task with `local` exist)
    types:
        echo: # Must be same as `getType` return value
            name: Example echo task
            class_name: Released\QueueBundle\Model\EchoTask
            local: false # Force this type of tasks run only on the server it was created on

如果你收到 类型 'your_task' 未找到 异常,你很可能在 config.yml 中忘记定义任务。

本地任务仅在创建它们的服务器上运行。这对于处理上传文件等场景非常有用,这些场景涉及多个服务器。

用法

用法非常简单。要创建一个可排队的任务,你需要只需扩展从 BaseTask 类的类并实现抽象方法。完成这些操作后,您可以使用 released.queue.task_queue.service 服务计划任务。

<?php
    $queue = $container->get('released.queue.task_queue.service');
    
    $task1 = new CreateQuoteTask(['order_id' => $order->getId()]);
    $queue->addTask($task1); // Plan task execution 
    
    // This task will only start after previous is successfully completed
    $task2 = new ValidateQuoteTask(['order_id' => $order->getId()], $task1);
    $queue->addTask($task2);

实现的 execute 方法具有 Symfony 容器。请参见 EchoTask 作为示例。

要运行排队的任务,您需要在控制台中运行命令

./bin/console released:queue:execute-task --permanent --cycles-limit=10 --cycle-delay=5 --memory-limit=XXX --single-id=THREAD_ID
./bin/console released:queue:execute-task-amqp --single-id=THREAD_ID

在哪里

  • --permanent 不立即退出命令,但保持活动状态并等待新任务
  • --cycles-limit (仅限数据库) 指定循环限制,一旦达到,任务将退出。请注意,循环 在每次检查队列时都会增加,即使没有执行任何任务
  • --cycle-delay (仅限数据库) 两次队列检查之间的延迟(以秒为单位)
  • --memory-limit (仅限数据库,待办事项:amqp) 以字节为单位的内存限制,一旦达到,任务将退出
  • --single-id 用于运行具有相同名称的多个任务。下面将详细解释。

默认情况下,只能运行一个此任务实例。每次运行此命令时,它将检查是否有正在运行的命令,并在有正在运行的命令时退出。当您需要运行多个任务时,可以指定一个 --single-id 选项。值不重要,只要每次运行尝试都不同即可。
这样做的目的是您可以将其添加到 cron 中,每分钟运行一次,并确信同一时间只有一个具有特定 single-id 的任务正在运行。

默认情况下,缓存目录用于保存任务进程 ID,这并不安全,因为它们可能会被删除并丢失进程 ID。建议指定 --pid-dir=path/to/dir/with/pids/ 选项,以在安全的地方保存进程 ID。

作业

当无法预先确定工作量时,使用作业。例如,从数据库中检索所有产品的数据。当产品数量很少时,更新它们的外观会工作,但产品数量增加时,代码将运行更长,您将失去更多控制。

使用作业时,您首先计划要执行的工作,创建任务,然后每个任务执行,当所有任务完成后,作业完成。当您有大量项目需要处理,而规划步骤需要太多时间或内存时,您可以在一切都规划完毕之前计划一系列任务。

稍后提供更多描述。