微信公众号:老夫撸代码
本期:你还在手写定时器么?那你就OUT了
定时任务调度需求
在日常的开发当中,我们经常会遇到类似如下需求:
- 1、每天凌晨12点执行某个数据库操作。
- 2、每隔2个小时拉取一下某系统的数据。
- 3、每秒钟查询数据库中某个状态,然后执行某种操作。
- 4、…
上述需求我相信大家在刚步入小白程序员的阶段就已经遇到过了。
我列举一下各种语言的一般处理方式:
- Java 一(老)般(夫)使用Quartz框架来做定时任务。
- PHP 一般通过服务器的定时任务调度实现。
- Python 使用一些定时任务调度的框架或者通过服务器的定时任务调度来实现。
上面列举的定时任务处理的方式不是不好,只是在不同的场景下处理的方式不够理想而已。
通常我在看待一个问题或者程序实现方式的时候,绝对不会武断的定性为好或者不好,更不可能说出类似“PHP是世界上最好的语言”这种极其具有挑衅的话来。
定时任务隐患
定时任务顾名思义是间隔一段时间执行某个任务完成某种操作。
如果定时任务停不下来呢?
当大家在写定时任务程序的代码的时候,就应该将相应的逻辑加入。
比如可以根据某个状态开启和暂停。
这里我们说的是定时器中任务执行的某种操作而不是定时器本身,因为定时器本身跑起来后,一般是无法停止。
记得在很久之前的政府项目中用到了定时器,这个定时器交给了一个小白程序员 ,当时因为某种原因要迁移数据库需要导出sql文件,但是定时器一直在写入数据库,而小白的定时开关控制出BUG了,无法关闭。最后,只能是把应用关掉后进行迁移操作,好在当时用户量不是很大。
上面的事情给大家的教训是定时操作某个任务一定是可控的,如果不可控那就变成定时灾难了。
Swoole介绍
Swoole是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升。
因为swoole服务可以常驻内存,我们可以向swoole work进程添加定时器任务来完成操作。
基于Docker的swoole镜像
这里我们不对Docker展开讲述,感兴趣的童鞋可以百度一下。
这里我们主要是基于Swoole-Crontab这个项目做的镜像。
Swoole-Crontab
1.概述
- 基于swoole的定时器程序,支持秒级处理.
- 异步多进程处理。
- 完全兼容crontab语法,且支持秒的配置,可使用数组规定好精确操作时间
- 单中心-多客户端模式,能够横向扩展
- web界面管理,增删改查任务,完整的权限控制.
- 镜像已经集成swoole扩展
2.Crontab配置
时间配置
- 0 sec (0-59)[可省略,如果没有0位,则最小时间粒度是分钟]
- 1 -> min (0 - 59)
- 2 -> hour (0 - 23)
- 3 -> day of month (1 - 31)
- 4 -> month (1 - 12)
- 5 -> day of week (0 - 6) (Sunday=0)
3.开始使用
docker run --name swoole -p 8081:80 -p 8901:8901 -m 500m -w /var/www/html -d pythonsir/swoole:1.2
3.1修改配置
3.1.1 中心服配置
/var/www/html/src/center/configs/dev/db.php 进入容器修改数据库配置
使用docker cp命令复制 /var/www/html/src/doc/crontab.sql 到 宿主机,然后导入数据库
3.1.2 admin管理后台的配置文件修改
/var/www/html/src/admin/configs/dev/db.php 修改数据库配置
/var/www/html/src/admin/configs/dev/service.php 中心服启动时候监听的ip端口,需要跟中心服通讯
4.启动中心服务
/path/to/php /var/www/html/src/center/center start -d -h 127.0.0.1 -p 8901
5.启动客户端
-h 是指中心服地址 -p 中心服端口
/path/to/php /var/www/html/src/agent/agent.php start -d -h 127.0.0.1 -p 8901
6.web界面访问
- 浏览器输入
http://localhost:8081
- 默认用户名/密码是
admin/admin
- 如果发送任务,请
kill
掉容器,重启容器即可。
7. 非容器环境下使用
- Github :
https://github.com/osgochina/Donkey/
运行效果
结尾
如果童鞋们在使用过程中遇到困难,直接在公众号中留言,老夫尽可能提供帮助。