Laravel Crontab 支持的最小单位是分钟,怎么实现秒级执行的需求呢?

简介: Laravel Crontab 支持的最小单位是分钟,怎么实现秒级执行的需求呢?

需求描述


今天接到一个需求,每三秒钟给客户端推送一次最新的在线人数。


分析


每三秒钟?要这么频繁吗?之前的最小颗粒度是每分钟哇。

调研了一波发现,我们可以结合异步任务的delay来实现。


核心代码


在 onQueue()函数后面调用 delay()函数

delay指定了延迟多久执行


XxxxxJob::dispatch()
    ->onQueue(QueueNameBuilder::getName(QueueNameBuilder::PUSH_DATING_COUNT))
    ->delay(now()->addSeconds($delay));


需求实现


比如我们的需求是,每三秒钟给客户端推送一次数据。

我的设计是这样的:


异步任务代码


<?php
namespace App\Console\Crontab;
use App\Jobs\PushDatingCountJob;
use App\Model\House\HouseOpen;
use App\Model\Queue\QueueNameBuilder;
class PushDatingCount extends BaseCrontab
{
    const RATE_SECOND = 3; //每三秒发送一次 延迟实现
    public function __invoke()
    {
        $times = 60 / self::RATE_SECOND;
        $delayTimes = [];
        for ($i = 0; $i < $times; $i++) {
            $delayTimes[] = $i * 3;
        }
        foreach ($delayTimes as $delay) {
            PushDatingCountJob::dispatch()
                ->onQueue(QueueNameBuilder::getName(QueueNameBuilder::PUSH_DATING_COUNT))
                ->delay(now()->addSeconds($delay));
        }
    }
}


Kernel


<?php
namespace App\Console;
.
.
.
class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];
    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        .
        .
        .
        //每分钟执行一次
        $schedule->call(new PushDatingCount())
            ->cron("* * * * *")
            ->name("push_dating_count")
            ->onOneServer();
    }
    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');
        require base_path('routes/console.php');
    }
}


通过这个思路我们就实现了需求。


更多的使用技巧


本地测试阶段不方面使用异步任务队列怎么办呢?


我们可以使用dispatchNow()


比如:

本地执行,不使用异步队列的情况:


UserConfirmForAdmin::dispatchNow([
            'data' => $data,
            'adminId' => $adminId,
        ]);


使用异步任务队列执行的情况:


UserConfirmForAdmin::dispatch([
            'data' => $data,
            'adminId' => $adminId,
        ])->onQueue(QueueNameBuilder::getName(QueueNameBuilder::USER_CONFIRM_FOR_ADMIN));


如何可视化查询异步任务的执行情况呢?


我们可以使用 horizon

我们通过仪表盘能够非常方便的进行数据监控,查看数据指标,查看最近失败的异步任务,可以通过后台重新执行异步任务


微信图片_20221111233802.jpg


重点说一下执行失败的异步任务,后台是支持查看数据参数的,方便我们定位问题。


微信图片_20221111233806.jpg


相关文章
|
11月前
|
Oracle 关系型数据库 Linux
解决在linux服务器上部署定时自动查找cpu,内存,磁盘使用量,并将查询结果写入数据库的脚本,只能手动运行实现插库操作
问题描述:将脚本名命名为mortior.sh(以下简称mo),手动执行脚本后查询数据库,表中有相应的信息,放入自动执行队列中,脚本被执行,但是查询数据库,并没有新增数据。
76 0
|
Python Windows
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
|
NoSQL API 调度
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
168 0
|
3月前
|
运维 Serverless API
函数计算产品使用问题之如何配置单实例的并发数
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
SQL 关系型数据库 MySQL
PolarDB产品使用问题之想要所有表执行是否需要时间分段执行
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
监控 Linux
在Linux中,有⼀个脚本运行时间可能超过2天,如何做才能使其不间断的运行,而且还可以随时观察脚本运行时的输出信息?
在Linux中,有⼀个脚本运行时间可能超过2天,如何做才能使其不间断的运行,而且还可以随时观察脚本运行时的输出信息?
|
4月前
|
运维 Serverless KVM
函数计算产品使用问题之如何处理冷启动时间过长的问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
弹性计算 运维 Serverless
函数计算产品使用问题之如何自己设置定时任务
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
编译器 程序员 C语言
编译时间和运行态时间交换的优缺点
编译时间和运行态时间交换的优缺点
98 0
|
Linux PHP
php常用自建函数学习(3):格林威治标准时间、格式化(Y-m-d H:i:s)的时间、Linux时间截转换
php常用自建函数学习(3):格林威治标准时间、格式化(Y-m-d H:i:s)的时间、Linux时间截转换
133 0