ydin/jobman

0.1.0 2019-09-03 01:32 UTC

This package is auto-updated.

Last update: 2024-09-28 17:23:05 UTC


README

  • horizon + 分发工作

Jobman 流程

  1. 生成一个需要进入队列的 'hello' 工作,准备好该内容
  2. 在 'jobmans' 表中建立数据 type=hello, attribs={json...}
  3. job 可能因为失败而执行多次,jobmans 表只保留部分足迹
  4. 如果你已开启 worker 服务器,那么工作将进入 jobman 流程

Jobman 流程图

flow

laravel 表

  • 使用 laravel 提供的 "failed_jobs" 表,该程序会建立这些表

依赖

  • redis
  • laravel horizon 包
  • laravel horizon 配置文件
  • 数据库:laravel 表 "failed_jobs"

启用 horizon

# 參數 --environment=local 的使用情況非常不穩定, 不使用 at laravel 5.8.26
php artisan horizon 
google-chrome http://127.0.0.1:8000/horizon/dashboard

查看当前情况

php artisan horizon:status
php artisan horizon:list

修正程序后,重试失败的 job

php artisan horizon:terminate   # 修正程式後, 要重新啟動
php artisan horizon             # 如果有建立並且啟用 supervisor, 消失時會自動啟動
php artisan queue:retry 5       # "failed_jobs" table "id" field
php artisan queue:retry all

如何创建一个新的 job

  1. 参考程序 src/Jobs/HelloWorldJob.php
  2. 在任意路径建立程序 job
  3. 新增设置 config/jobman.php
  4. 新增设置 config/horizon.php
  5. 重新执行 php artisan horizon
  6. 重新启动 supervisor (可选)
  7. 触发你的代码,参考 src/Console/Commands/TryHelloCommand.php

jobmans 部分的字段说明

  • attribs
    • 传递 job 需要的消息
    • 有些 job 需要返回值,也可以回存在这里
  • logs
    • 希望在 job 中留下操作的记录
    • 这些记录是在发生问题才需要查看的
    • 因此不希望留在 laravel.log 中
    • 可以记录在这里
  • error_message
    • 保留最后一次的 $exception->getMessage()
  • exception
    • 保留最后一次的 Exception
  • failed_at
    • 如果曾经失败过,在成功之后,还是会保留该值
  • completed_at
    • 完成任务,但并不代表结果是正确的,有些结果不是只有一种
  • completed_code
    • 通常是 null
    • 如果结果不是只有一种,可以存在这里
    • 例如
      • 将数据添加到数据库,但是该数据已存在,但是这两种情况都符合 job 之目的
        • success
        • already-exists
      • 非同步的方式删除一个 blog,如果不存在,就结束工作
        • success
        • blog-not-found

应做未做的部分

  • 超过 6 个月的资料可以删除

    • SELECT * FROM jobmans WHERE created_at < DATE_SUB(NOW(), INTERVAL 180 DAY);
  • 未加入 queue 的 Jobman

    • Jobman push() 的时候如果没有开启 redis
    • 那么这些 jobmans 将永远不会被执行到
    • 建立一个 console command 将这些 jobman 丢到 redis
    • 该功能一方面也可以再次执行 jobman