🚀 🏆 Task Platform Developed Based On Swow and Php8
如今通过PHP开发的任务平台还是停留在原来地同步阻塞模式,通过结合swow开启PHP高性能时代,正式拥抱协程。消息队列选择Nsq利用其易部署,高性能,支持分布式特性。通过Redis分布式锁防止任务并行,实现watchdog防止任务还在执行,而redis锁被释放。给锁续期。该任务平台支持API投递,可以限制其执行时间,支持任务编排,用户可以实时查看任务详情和取消任务,后台支持丰富的图表包括任务统计(成功,失败...)
1.支持Api投递任务.推送Nsq进行消费.(完成)
2.支持任务单个运行,并限制在时间内.超出限制时间抛异常(完成)
3.支持任务编排,单个任务限制时间.(完成)
4.支持任务编排支持事务.(暂不考虑)
5.支持重试机制,中间件(完成)
6.支持API查看任务消息
7.支持后台配置任务.
8.支持定时任务Crontab.(完成,考虑是否取消定时任务)
9.支持任务图表(成功,失败,重试,超时,终止.)(开发中)
10.支持任务取消(完成)
11.签名验证(完成)
12.支持刷新应用签名(完成)
13.支持系统监控基于xhprof(不支持sql)不建议开启
14.workflow->https://github.com/uuf6429/state-engine-php
15.支持分布式(Task可以支持分布式)(完成)
16.支持分布式锁(watchdog实现给锁续期)
17.任务执行超时时kill掉,资源回收(完成)
18.支持debug和trace查看(https://github.com/chevere/xr)
19.watchdog限制其最大执行时间 默认60s
20.美化了Swow提供的Debugger组件。
21.新增Debugger:m->获取当前使用内存,server->获取当前服务server信息包括Host,Port,连接数
1.传递的任务Task必须实现JobInterface
2.不能包含资源对象.
3.Swow/channel push 和pop 都是毫秒.任务都可以支持毫秒.以后必须要注意.
4.Di主要使用Hyperf/Di
5.取消任务使用kill
6.crontab随消费进程一起启动
7.限制任务执行时间通过channel 限制pop时间如果pop超时直接对执行任务的协程抛出异常.$coroutine->throw($exception);
[ERROR] Consumer failed to consume Consumer,reason: Channel wait producer failed, reason: Timed out for 5000 ms,file: /Users/heping/Serendipity-Job/src/Util/Waiter.php,line: 53
8.不建议同时启动dag和task两个消费。最好单独部署两个项目,server需要连接对应消费端启动的server查看任务详情或者取消任务.而且定时任务没有做集群处理。多台机器只能执行一个任务.
9.请尽量使用框架自带协程的创建方法,主要用日志上下文管理
Hyperf\Utils\Coroutine::create()
10.任务执行时间尽量调大一点
11.dag(任务编排)的执行时间必须要小于nsq的max_msg_timeout的时间,因为超过了nsq会重新入队列
见API.md
- 环境
- 通过获取服务节点操作任务(分布式),在计划中
- 考虑优化项目结构
- 支持任务图表
- 后台
- 适配其他框架(需要优化项目架构后)
- codecov代码覆盖率
- 静下来想想思考项目的规划,架构
- 考虑使用swow-cloud/redis-subscriber订阅消息
- 支持后台创建任务
- 支持ORM
- FORM
1.PHP8
2.Nsq
3.redis
4.mysql
5.ext-swow
6.consul
7.ext-simdjson(https://github.com/crazyxman/simdjson_php)
composer require swow-cloud/job -vvv
需要把config.php
container.php
providers.yaml
和autoload
目录下的文件复制到项目config
目录中
- 启动server
vendor/bin/blend server:start
- 停止server
vendor/bin/blend server:stop
- 重新启动
vendor/bin/blend server:restart
1.启动Serendipity-Job Server.
vendor/bin/job swow-cloud-job:start
2.启动Job 进行任务消费
vendor/bin/job job:start --host=127.0.0.1 --port=9764
1.host server host监听地址,用于取消任务或者查看任务详情
2.port server port监听端口号
3.配置Crontab
(new SwowCloud\Job\Crontab\Crontab())->setName('Foo')->setRule('*/5 * * * *')->setCallback([EchoCrontab::class, 'execute'])->setMemo('这是一个示例的定时任务'),