swoole+php搭建高性能脚本服务

后台服务的业务逻辑中,或多或少需要一些异步去处理的脚本逻辑,例如业务的统计、上报、数据运算,定时监控等等。实现的方法也有很多,用linux自带的crontab,定时清理服务器上的日志就很常用,由于Python处理数据的优势,很多开发童鞋也会用python来跑一些需要运算的脚本,另外还有网上流行的一些脚本框架,一些大公司也有自己研发的框架服务。在最近的项目中,接触到swoole2+与php7+搭配的性能优越,普通4核心CPU,单机压测qps 10000+/s,突生灵感,除了用来搭后端服务,能不能用来搭一个脚本服务呢?

于是归纳了一下以前跑脚本的问题:

1、crontab:不能实现到秒级,最多到分钟级,这是很多开发的小痛点,当然想实现秒级也是可以滴,这么写:    
 ***** sleep 10;/usr/bin/myshell.sh     
 ***** sleep 20;/usr/bin/myshell.sh     
 ***** sleep 30;/usr/bin/myshell.sh    
 ***** sleep 40;/usr/bin/myshell.sh     
 ***** sleep 50;/usr/bin/myshell.sh
 变相实现10秒执行一次,但这做法有点low有木有,而且crontab多了比较离散,缺乏集中管理。当然这里可以用一些
 crontab的管理工具来维护。
2、搭一套同步服务框架,走服务请求来跑脚本,这里有个好处,本身的服务的很多方法函数,走脚本服务框架时可以复用。
   但传统服务框架thinkphp、CI等性能较低,脚本内的逻辑存在调用下游时,由于下游服务的不可靠性。导致超时阻塞,
   服务雪崩,影响其它脚本。
3、其它第三方架构,包括之前用公司内部的一些脚本大师,都不甚好用。要么存在同步阻塞,要么时间粒度太粗,要么缺
   少好的监控。

问题理清楚后,需求也就很清晰了:

1、时间粒度精确到秒。

2、有监控脚本,各脚本运行情况。

3、高性能,多任务同时在跑,不会相互影响。

表简单设计如下:

CREATE TABLE `task` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task_desc` varchar(256) NOT NULL COMMENT '任务描述',
  `task_name` varchar(128) NOT NULL COMMENT '任务名称,对应控制器',
  `task_crontab` varchar(128) NOT NULL COMMENT '每隔多久执行一次',
  `task_status` tinyint(4) NOT NULL DEFAULT '-1' COMMENT '-1未启用,0等待下次执行,1执行中',
  `runnings` smallint(6) NOT NULL DEFAULT '0' COMMENT '正在执行的进程数',
  `is_multy` tinyint(4) NOT NULL DEFAULT '0' COMMENT '1允许同时执行多个;0须等待上一次执行完才执行下一次,即使下次执行时间到。',
  `exec_times` int(11) NOT NULL DEFAULT '0' COMMENT '已累计执行次数',
  `err_times` int(11) NOT NULL DEFAULT '0' COMMENT '累计失败次数',
  `last_exec_time` datetime NOT NULL COMMENT '最后执行时间',
  `next_exec_time` datetime NOT NULL COMMENT '下一次准备执行时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='任务管理表'

例如下面添加了一条测试任务:

任务的名称对应脚本框架服务中有一个控制器,来处理脚本逻辑。

脚本服务的调度流程

服务相关事项:

1、shell起多个task.sh进程去调脚本框架服务的main入口,脚本服务支持1w+qps/s,这里起多少个进程视情况定。
eg:#!/bin/bash
    while ((1));do
      exec main
    sleep 1
    done
2、用check_task.sh监控脚本task.sh是否运行。
    #!/bin/bash
    count=`ps aux|grep "task_idc"|grep -v 'grep'|wc -l`
    if [ $count -lt 1 ]; then
        echo `bash task_idc.sh 2>&1 &`
    fi
3、next_exec_time每个任务下一次执行时间,如果有任务这个时间小过了当前时间,所以有任务不健康,这里简单监控下。
    conn="mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} ${DBNAME}"
    select_sql="select id,task_crontab,unix_timestamp(next_exec_time) from ${TABLENAME} where task_status>-1"
    ${conn} -s -e "${select_sql}">${FILE_PATH}
    IFS_OLD=${IFS}
    IFS=$'\n'
    NOWTIME=$(date +%s)
    IS_ALARM=0
    for line in `cat ${FILE_PATH}`
    do
        ID=$(echo ${line}|awk '{print $1}')
        SEC=$(echo ${line}|awk '{print $2}')
        TIME=$(echo ${line}|awk '{print $3}')
        if [ ${TIME} -lt $[ ${NOWTIME}-1800 ] ];then//时间可以自由定
                IS_ALARM=1
        fi
    done
    IFS=${IFS_OLD}
    if [ ${IS_ALARM} -eq 1 ];then
      //告警
    fi
4、脚本服务框架的本身是否运行的监控check_server.sh。

任务服务注意事项:

1、并发读取待执行任务,防止高并发时被读到同一条任务,利用MYSQL的DML的原子性保证。
2、拉待执行任务的时候,非超级任务,不可拉执行中的,超级任务才可以拉执行中,因为只有超级任务定义为,不需要等待上一
   次执行完,才执行下一次。
3、结束单条任务的时候,同样需要注意超级任务与非超级任务的区别来决定 runnings 和 status 的状态。

这套脚本服务主要用于php执行业务相关逻辑,当然php也可以运行shell脚本,但不支持python等其它一些语言的脚本调用。并没有高大尚的技术,充分发挥了swoole+php的性能,有更好的脚本框架的开发者,欢迎一起交流进步 ^ ^

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

MySQL学习笔记_如何选择合适的存储引擎

http://www.cnblogs.com/huligong1234/archive/2012/06/10/2544154.html

9530
来自专栏Python中文社区

用Python测试InnoDB和MyISAM的读写性能

首先我们需要把两张使用了不同引擎的表创建出来,使用为了方便起见,我们直接使用Navicat创建了两张 员工信息表,具体字段如下:

21530
来自专栏杨建荣的学习笔记

关于评审开发人员的sql语句(r3笔记第11天)

在平时的工作中,经常会有一些开发人员提出一些数据库相关的一些问题。可能问的最多的就是sql语句了。 按照一个标准的流程,开发提交的sql语句在完成一系列测试之后...

40570
来自专栏菜鸟致敬

My SQL 简介

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management Syste...

35470
来自专栏Java架构师历程

MySQL的三大引擎

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本 的差别为:

2.1K20
来自专栏JAVA高级架构

MySQL 调优/优化的 100 个建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装...

40940
来自专栏Java技术栈

MySQL 调优/优化的 101 个建议!

原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/ MySQL是...

48360
来自专栏数据库

试用ODU软件恢复corrupt block

Oracle的数据恢复处理,有各种方法工具支持,在这方面,我算是一个新手,也是处于不断的学习中。 业界有一些著名的恢复软件,简单罗列一下, 1. Oracle ...

32650
来自专栏沃趣科技

使用pg_stat_statement监控pgsql遇到的问题

pg_stat_statements是PG中监控数据库活动的重要插件,通过它可以获得SQL的统计信息,例如该SQL被调用了多少次,返回了多少记录,在读写数据上...

39850
来自专栏杨建荣的学习笔记

并行查询缓慢的问题分析(r5笔记第86天)

今天,数据迁移组的同事问我一个问题,说他们现在需要在迁移库中查看一些数据,但是查看的时候速度很慢,想让我们看看是不是数据库端出了什么问题。因为数据迁移的一些准备...

29160

扫码关注云+社区

领取腾讯云代金券