laravel/Lumen队列

laravel队列

配置

  • 配置文件 config/queue.php 中添加代码

 env('QUEUE_CONNECTION', 'sync'),

    'connections' => [

        'sync' => [

            'driver' => 'sync',

        ],

        'database' => [

            'driver' => 'database',

            'table' => env('QUEUE_TABLE', 'jobs'),

            'queue' => 'default',

            'retry_after' => 90,

        ],

        'beanstalkd' => [

            'driver' => 'beanstalkd',

            'host' => 'localhost',

            'queue' => 'default',

            'retry_after' => 90,

        ],

        'sqs' => [

            'driver' => 'sqs',

            'key' => env('SQS_KEY', 'your-public-key'),

            'secret' => env('SQS_SECRET', 'your-secret-key'),

            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),

            'queue' => env('SQS_QUEUE', 'your-queue-name'),

            'region' => env('SQS_REGION', 'us-east-1'),

        ],

        'redis' => [

            'driver' => 'redis',

            'connection' => env('QUEUE_REDIS_CONNECTION', 'default'),

            'queue' => 'default',

            'retry_after' => 900,

            'block_for' => null,

        ],

    ],

    'failed' => [

        'database' => env('DB_CONNECTION', 'mysql'),

        'table' => env('QUEUE_FAILED_TABLE', 'failed_jobs'),

    ],

];

  • 配置文件 config/database.php 中redis部分如下
 env('DB_CONNECTION', 'mysql'),

    'redis' => [

        'client' => 'predis',

        'cluster' => env('REDIS_CLUSTER', false),

        'default' => [
            'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
            'password' => env('LIANSHAN_REDIS_PWD', null),
            'port' => env('LIANSHAN_REDIS_PROT', 6379),
            'database' => env('LIANSHAN_REDIS_DATABASE', 0),
        ],

        'cache' => [
            'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
            'password' => env('LIANSHAN_REDIS_PWD', null),
            'port' => env('LIANSHAN_REDIS_PROT', 6379),
            'database' => env('LIANSHAN_CACHE_DB', 1),
        ],

    ],
];
  • .env文件中 QUEUE_CONNECTION=redis 有4种驱动选择,对应上步中的配置 默认是sync,即同步的,直接处理,无队列
  • 对应的mysql中有 jobs 与 failed_jobs 表,记录任务执行情况,对应配置文件的设置
迁移文件生成
jobs表
php artisan queue:table
失败任务表
php artisan queue:failed-table
  • 如果选择redis驱动,需要安装 predis 类库包,低版本 lumen 需要安装 illuminate/redis

使用


// 生产者

use App\Jobs\VideoReportJob;

dispatch((new VideoReportJob($param1, $param2))->onQueue('queue1'));



// 消费者

param1 = $param1;

        $this->param2 = $param2;

    }

    /**

    * Execute the job.

    *

    * @return void

    */

    public function handle()

    {

        // 耗时的任务内容

        sleep(50);

    }

    public function failed()

    {

        // 任务执行失败,超时,代码报错拦截处理

    }

}

// 启动队列

php artisan queue:work --queue=queue1

执行失败的任务会在 config/queue.php 中配置的表中记录 默认是 failed_jobs 表

超时配置

config/queue.php 中的 retry_after ,该配置项的目的是定义任务在执行以后多少秒后释放回队列。如果retry_after设定的值为90, 任务在运行90秒后还未完成,那么将被释放回队列而不是删除掉,将会再次执行

消费者中的 timeout 控制队列进程执行每个任务的最长时间,如果超时,该进程将被关闭

配置项retry_after 和 Aritisan 参数项--timeout不同,但目的都是为了确保任务的安全,并且只被成功的执行一次。参数项--timeout的值应该是中小于配置项retry_after的值,这是为了确保队列进程总在任务重试以前关闭。如果--timeout比retry_after大,则你的任务可能被执行两次。

例如比如说你把 retry_after 设置为 20,好,假设现在有一个 job 它需要耗费 15 到 25 秒不等的时间来完成,假设处理 job 的那个程序在处理到第 20 秒还没完成时,它就不继续处理了,把这个 job 放回任务队列中,然后再尝试处理(retry),这次运气好,它处理到 17 秒就完成了,那就完事了,接着处理下一个 job

你可能感兴趣的:(laravel/Lumen队列)