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


相关文章
|
Oracle 关系型数据库 Linux
解决在linux服务器上部署定时自动查找cpu,内存,磁盘使用量,并将查询结果写入数据库的脚本,只能手动运行实现插库操作
问题描述:将脚本名命名为mortior.sh(以下简称mo),手动执行脚本后查询数据库,表中有相应的信息,放入自动执行队列中,脚本被执行,但是查询数据库,并没有新增数据。
80 0
|
Python Windows
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本
|
NoSQL API 调度
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
183 0
|
23天前
|
存储 Java 调度
Sppring集成Quartz简单案例详解 包括(添加、停止、恢复、删除任务、获取下次执行时间等)
Sppring集成Quartz简单案例详解 包括(添加、停止、恢复、删除任务、获取下次执行时间等)
21 2
|
21天前
|
SQL 分布式计算 运维
如何优化超长定时任务:慢节点优化实践
本文介绍了一个复杂的ODPS任务优化过程。通过对任务耗时卡点的分析,发现主要问题是数据倾斜和join任务资源不足。通过提高join任务资源分配、对空值加随机值打散、视图物化落表、节点拆分、前置裁剪和使用Distributed Mapjoin等方法,成功将宽表产出时间从下午一点提前到早上八点半,节省了4小时以上。优化过程中还拆分了宽表节点,降低了回刷成本。文章强调了在设计开发初期应避免代码耦合度过高,以提高代码运行效率和可维护性。
30 0
|
4月前
|
运维 Java Serverless
函数计算产品使用问题之事件函数单实例的并发度默认是多少
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
127 6
函数计算产品使用问题之事件函数单实例的并发度默认是多少
|
4月前
|
运维 Serverless API
函数计算产品使用问题之如何配置单实例的并发数
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
监控 Linux
在Linux中,有⼀个脚本运行时间可能超过2天,如何做才能使其不间断的运行,而且还可以随时观察脚本运行时的输出信息?
在Linux中,有⼀个脚本运行时间可能超过2天,如何做才能使其不间断的运行,而且还可以随时观察脚本运行时的输出信息?
|
6月前
|
数据安全/隐私保护
如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件
该文提供了一个工具的下载链接,分别在百度网盘和蓝奏云,提取码分别为&qwu2&quot;和&quot;2r1z&quot;。工具的使用需结合之前发布的两篇教程:《快捷自由定时重启、注销、关机》和《如何从多个文件夹内转移全部文件(忽略文件夹的结构)(进行复制)(再打包)》。操作步骤包括设定&quot;来源路径&quot;进行Zip打包,启用&quot;备份模式&quot;,然后保存批量复制任务,最后在定时器中执行已设置的批量文件复制任务。文中附有相关截图以供参考。
|
Linux PHP
php常用自建函数学习(3):格林威治标准时间、格式化(Y-m-d H:i:s)的时间、Linux时间截转换
php常用自建函数学习(3):格林威治标准时间、格式化(Y-m-d H:i:s)的时间、Linux时间截转换
136 0
下一篇
无影云桌面