当前位置: 首页 > 编程日记 > 正文

高性能千万级定时任务管理服务forsun使用详解

Forsun高性能高精度定时服务,轻松管理千万级定时任务。
项目地址: https://github.com/snower/forsun

  • 使用 linux 系统定时器提供精确到秒级的定时调度,长时间运行保证无误差。
  • 支持本地内存存储和 redis 持久化存储,使用 redis 可轻松管理数千万定时任务。
  • 支持命令行创建删除任务,支持Apache Thrift接口调用创建和删除更新定时任务信息。
  • 支持 shell、http、redis、thrift、beanstalk、mysql 六种到时触发回调方式,并可以通过扩展轻松自定义回调器。

背景

在实际项目中,存在大量需要定时或是延时触发的任务,比如电商中,延时需要检查订单是否支付成功,是否配送成功,定时给用户推送提醒等等,常规做法是用 crontab 每分钟扫码数据看是否到达时间,繁琐且扩展性伸缩性较差。

使用 forsun 服务,可以简单的针对每一个订单创建一个定时任务,配合异步队列,可以轻松实现扩展性伸缩性,Apache Thrift 的编程接口也可以很容易的和 celery、laravel 配合。

其他场景下,比如失败延时重试,使用 forsun 定时服务也可以很简单就可以实现。

安装启动

使用pip自动安装

pip install forsun

帮助

forsund -h
usage: forsund [-h] [--bind BIND_HOST] [--port BIND_PORT] [--demon DEMON][--log LOG_FILE] [--log-level LOG_LEVEL] [--driver DRIVER][--driver-mem-store-file STORE_MEM_STORE_FILE][--driver-redis-host DRIVER_REDIS_HOST][--driver-redis-port DRIVER_REDIS_PORT][--driver-redis-db DRIVER_REDIS_DB][--driver-redis-prefix DRIVER_REDIS_PREFIX][--driver-redis-server-id DRIVER_REDIS_SERVER_ID][--extension-path EXTENSION_PATH] [--extension EXTENSIONS]High-performance timing scheduling serviceoptional arguments:-h, --help            show this help message and exit--bind BIND_HOST      bind host (default: 0.0.0.0)--port BIND_PORT      bind port (default: 6458)--demon DEMON         run demon mode--log LOG_FILE        log file--log-level LOG_LEVELlog level (defaul: INFO)--driver DRIVER       store driver mem or redis (defaul: mem)--driver-mem-store-file STORE_MEM_STORE_FILEstore mem driver store file (defaul:/tmp/forsun.session)--driver-redis-host DRIVER_REDIS_HOSTstore reids driver host (defaul: 127.0.0.1)--driver-redis-port DRIVER_REDIS_PORTstore reids driver port (defaul: 6379)--driver-redis-db DRIVER_REDIS_DBstore reids driver db (defaul: 0)--driver-redis-prefix DRIVER_REDIS_PREFIXstore reids driver key prefix (defaul: forsun)--driver-redis-server-id DRIVER_REDIS_SERVER_IDstore reids driver server id (defaul: 0)--extension-path EXTENSION_PATHextension path--extension EXTENSIONSextension name

使用内存持久化存储启动:

forsund --bind=0.0.0.0 --log=/var/log/forsun.log --log-level=INFO --driver=mem --driver-mem-store-file=/var/lib/fousun/forsun.session --demon

使用redis持久化存储启动:

forsund --bind=0.0.0.0 --log=/var/log/forsun.log --log-level=INFO --driver=redis --driver-redis-host=127.0.0.1 --driver-redis-db=1 --demon

注意:使用mem存储时只有进程正常退出时才会序列化任务保存到本地文件,下次启动时可能会丢失任务,建议使用性能更高的redis存储方式。

使用示例

命令行帮助

forsun -h
usage: forsun [-h] [--host HOST] [--port PORT] [--exe EXECUTE] [cmd]High-performance timing scheduling servicepositional arguments:cmd            execute cmd (default: )optional arguments:-h, --help     show this help message and exit--host HOST    host (default: 127.0.0.1)--port PORT    port (default: 6458)--exe EXECUTE  execute cmd (default: )

延时运行示例

#每五秒运行redis命令,共运行一次
forsun "set redis */5/1 * * * * * redis 'host=172.16.0.2;command=\'SET b 1 EX 300\'"
#每五秒运行shell命令,共运行二次
forsun "set shell */5/2 * * * * * shell 'cmd=ls"
#每五秒运行beanstalk命令,共运行一次
forsun "set beanstalk */5/1 * * * * * beanstalk 'host=10.4.14.14;name=etask;body={}'"
#每五秒请求thrift接口,重复运行
forsun "set thrift */5/0 * * * * * thrift 'host=10.4.14.14;port=4220"
#每五秒请求http接口,共运行一次
forsun "set http */5/1 * * * * * http 'url=\'http://www.baidu.com\''"
#每五秒运行mysql命令,共运行一次
forsun "set mysql */5/1 * * * * * mysql 'host=172.16.0.2;user=root;passwd=123456;db=test;sql=\'update test set created_at=now() where id=1\'"

定时运行示例

#于每天16:32:00运行redis命令
forsun "set redis 0 32 16 * * * redis 'host=172.16.0.2;command=\'SET b 1 EX 300\'"
#于每小时32:00运行shell命令
forsun "set shell 0 32 * * * * shell 'cmd=ls"
#于每分钟1秒时运行beanstalk命令
forsun "set beanstalk 1 * * * * * beanstalk 'host=10.4.14.14;name=etask;body={}'"
#于每月3日16:32:00请求thrift接口
forsun "set thrift 0 32 16 3 * * thrift 'host=10.4.14.14;port=4220"
#于每天16:32:00请求http接口
forsun "set http 0 32 16 * * * http 'url=\'http://www.baidu.com\''"
#于每天16:32:00运行mysql命令
forsun "set mysql 32 16 * * * mysql 'host=172.16.0.2;user=root;passwd=123456;db=test;sql=\'update test set created_at=now() where id=1\'"

Apache Thrift接口文件定义

exception ForsunPlanError{1:i16 code,2:string message
}struct ForsunPlan {1: required bool is_time_out,2: required string key,3: required i16 second,4: i16 minute = -1,5: i16 hour = -1,6: i16 day = -1,7: i16 month = -1,8: i16 week = -1,9: required i32 next_time,10: i16 status = 0,11: i16 count = 0,12: i16 current_count = 0,13: i32 last_timeout = 0,14:string action = "shell",15:map<string, string> params = {}
}service Forsun{i16 ping(),#创建固定时间运行任务ForsunPlan create(1:string key, 2:i16 second, 3:i16 minute = -1, 4:i16 hour = -1, 5:i16 day = -1, 6:i16 month = -1, 7:i16 week = -1, 8:string action="shell", 9:map<string, string> params={}) throws (1:ForsunPlanError err),#创建延时运行任务ForsunPlan createTimeout(1:string key, 2:i16 second, 3:i16 minute = -1, 4:i16 hour = -1, 5:i16 day = -1, 6:i16 month = -1, 7:i16 week = -1, 8:i16 count=1, 9:string action="shell", 10:map<string, string> params={}) throws (1:ForsunPlanError err),#删除任务ForsunPlan remove(1:string key) throws (1:ForsunPlanError err),#获取任务信息ForsunPlan get(1:string key) throws (1:ForsunPlanError err),#获取当前即将运行任务列表list<ForsunPlan> getCurrent(),#获取某个时间运行任务列表list<ForsunPlan> getTime(1:i32 timestamp),#查询某些key前缀任务列表list<string> getKeys(1:string prefix),#thrift回调器请求函数定义void forsun_call(1:string key, 2:i32 ts, 3:map<string, string> params)
}

回调器参数详解

回调器参数为create和createTimeout最后一个参数params key和value的map。

shell参数

  • cmd shell命令
  • cwd 工作目录
  • env 环境变量,以;分割=号连接的字符串,如:a=1;b=c

http参数

  • url 请求接口URL字符串
  • method 请求方法,只支持get,post,put,delete,head五种方法
  • body 请求体字符串
  • header_ 以header_为前缀的key都会放到请求header中
  • auth_username 校验用户名
  • auth_password 校验密码
  • auth_mode 校验方法
  • user_agent 请求User-Agent
  • connect_timeout 连接超时时间,默认5秒
  • request_timeout 请求超时时间,默认60秒

redis参数

  • host redis服务器地址,默认127.0.0.1
  • port redis服务器端口,默认6379
  • selected_db redis运行命令db
  • max_connections 连接redis服务器最大连接数,第一次连接时的命令中的值有效
  • command 需要执行的命令,多条命令以;分割

mysql参数

  • host mysql服务器地址,默认127.0.0.1
  • port mysql服务器端口,默认3306
  • db mysql运行命令db,默认mysql
  • user mysql登陆用户名,默认root
  • passwd mysql登陆密码,默认空字符串
  • max_connections 连接redis服务器最大连接数,第一次连接时的命令中的值有效
  • sql 需要执行的sql

beanstalk参数

  • host beanstalk服务器地址,默认127.0.0.1
  • port beanstalk服务器端口,默认11300
  • name 队列名称,默认default
  • body 推送的消息体

thrift参数

回调thrift接口时,固定请求void forsun_call(1:string key, 2:i32 ts, 3:map<string, string> params)该函数,第三个params参数即为任务定义时的params值。

  • host thrift服务器地址,默认127.0.0.1
  • port thrift服务器端口,默认5643
  • max_connections 连接thrift服务器最大连接数,第一次连接时的命令中的值有效

原文地址: https://blog.snower.me/2018/0...

相关文章:

谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器

吃瓜教程——西瓜书南瓜书 Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 内容属性&#xff1a;机器学习&#xff08;理…

java 上传的图片大小为0_JAVA技术:上传图片的缩放处理

图片上传到后&#xff0c;会根据情况将图片缩小成一个图标&#xff0c;我们可以利用java强大的图形处理功能&#xff0c;对上传的图片进行缩放处理。下面的程序使用jdk1.4中最新的ImageIO对图片进行读写。使用AffineTransform对图片进行缩放。import java.io.File&#xff1b;i…

信息安全推荐书籍

本页列出了我发现的与计算机安全&#xff0c;数字取证&#xff0c;事件响应&#xff0c;恶意软件分析和逆向工程以及其他相关主题学习主题高度相关和有用的书籍。这些书从介绍性文本到高级研究作品。尽管这些书中的一些看起来有点过时&#xff0c;但所包含的信息对今天学习的人…

paip.odbc DSN的存储与读取

paip.odbc DSN的存储与读取 作者Attilax &#xff0c; EMAIL:1466519819qq.com 来源&#xff1a;attilax的专栏 地址&#xff1a;http://blog.csdn.net/attilax 1.列出系统级ODBC列表 ---------------------- [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data So…

【青少年编程】【三级】计算平均分

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

java 判断是否为邮箱_Java判断邮箱是否存在 有返回值

public static boolean checkEmail(String email) {if (!email.matches("[\\w\\.\\-]([\\w\\-]\\.)[\\w\\-]")) {return false;}String log "";String host "";String hostName email.split("")[1];// 去掉后面的System.out.printl…

Android Handler介绍

本文转自:http://www.cnblogs.com/keyindex/articles/1822463.html前言 学习android一段时间了&#xff0c;为了进一步了解android的应用是如何设计开发的&#xff0c;决定详细研究几个开源的android应用。从一些开源应用中吸收点东西&#xff0c;一边进行量的积累&#xff0c;…

阿里巴巴一年投三家AR公司,AR购物或是最终目标

阿里巴巴再投资AR公司&#xff0c;一年连续投资超2.2亿美元&#xff0c;它到底想要做什么&#xff1f; 最近&#xff0c;以色列AR眼镜厂商Lumus获得来自阿里巴巴的600万美元的投资。此前&#xff0c;镁客网报道过这家公司在去年12月份获得由广达电脑、HTC和盛大集团投资的300万…

青少年编程竞赛交流群周报(第035周)

2021年10月24日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第三十五期直播活动。 一、直播内容 我们直播活动的主要内容如下&#xff1a; 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题&#xff08;四级&#xff09;。…

java 接口工程_Java工程师(15)抽象类与接口

抽象类思考下面程序潜在的问题交通工具中定义了4个方法&#xff0c;其中行驶方法内部会依次调用启动、加速、停止方法。由于不同的交通工具&#xff0c;启动的方式差异很大&#xff0c;所以交通工具类中并不实现该方法&#xff0c;而是将其交给子类实现。上述代码的问题&#x…

为什么必须是final的呢?

一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话&#xff0c;那下面这种风格的代码对你来说应该不陌生&#xff1a; 1 2 3 4 5 6 7 8 9public void tryUsingGuava() {final int expectedLength 4;Iterables.filter(Lists.newArrayList("123", &…

java mvc view_对Springmvc view层的理解

MVC框架可以把应用清晰明了地分为三个部分&#xff1a;Model层–数据层&#xff0c;View层–视图层&#xff0c;Controller–逻辑层&#xff0c;Model层负责整合数据&#xff0c;View层负责页面渲染&#xff0c;Controller层负责实现业务逻辑。我在这里简单说一下我对MVC框架中…

【优秀作业】粒子群算法

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

面向对象进阶2 组合

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;命名空间 class Person:Country 中国人 # 静态变量print(Person.Country) alex Person() # 创建了一个空的命名空间 alex.name alex # 对象 alex.Country 泰国人 egon Person() egon.name ego…

Android基础知识之Manifest文件的组织结构

原文&#xff1a;http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签&#xff0c;她必须包含一个标签和指定的xmlns:android、 package两个属性。 属性&#xff1a; xmlns:android定义了Android的命名空间。这个属性一般可以设置为&#xff1a;&quo…

java类的注释模板_IDEA添加Java类注释模版的方法

本文介绍了idea添加java类注释模版的方法&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;idea版本&#xff1a;intellij idea 2017.2.5 x64eclipse能在类上方输入/**,回车添加类注释模版&#xff0c;但idea没有默认添加这个功能&#xff0c;需要做一些设置。下面介绍三…

POJ 2586 Y2K Accounting Bug(贪心)

题目连接&#xff1a;http://poj.org/problem?id2586 题意&#xff1a;某公司要统计全年盈利状况&#xff0c;对于每一个月来说&#xff0c;如果盈利则盈利S&#xff0c;如果亏空则亏空D。公司每五个月进行一次统计&#xff0c;全年共统计8次(1-5、2-6、3-7、4-8、5-9、6-10、…

【组队学习】10月份微信图文索引

10月份微信图文索引 一、组队学习相关 周报&#xff1a; Datawhale组队学习周报&#xff08;第036周&#xff09;Datawhale组队学习周报&#xff08;第035周&#xff09;Datawhale组队学习周报&#xff08;第034周&#xff09;Datawhale组队学习周报&#xff08;第033周&…

java spring scope_如何在Spring中自定义scope的方法示例

大家对于 Spring 的 scope 应该都不会默认。所谓 scope&#xff0c;字面理解就是“作用域”、“范围”&#xff0c;如果一个 bean 的 scope 配置为 singleton&#xff0c;则从容器中获取 bean 返回的对象都是相同的&#xff1b;如果 scope 配置为prototype&#xff0c;则每次返…

学习ExtJS4 常用控件

ExtJS组件配置方式介绍 1.使用逗号分隔参数列表配置组件 首先来看一个简单的逗号分隔参数列表的例子。这个例子非常简单&#xff0c;它用来显示信息提示框。 2.使用Json对象配置组件 接下来看一个使用Json对象配置组件的例子&#xff0c;很多地方习惯性称之为配…

青少年编程竞赛交流群周报(第036周)

2021年10月31日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第三十六期直播活动。 一、直播内容 我们直播活动的主要内容如下&#xff1a; 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题&#xff08;四级&#xff09;。…

中国电信打造“三朵云”战略 助力互联网+医疗发展

随着云计算、大数据的快速发展&#xff0c;全行业上云成为一个趋势&#xff0c;在健康医疗这个领域&#xff0c;应大势之趋&#xff0c;纷纷构建医疗云。近日&#xff0c;中国电信医疗云专区北京节点发布会在京顺利召开&#xff0c;会后北京电信副总经理项煌妹接受了中国IDC圈记…

python 数据类笔试题_一道 Python 类的笔试题详解

r {}class C(object):def __init__(self, a, b):self.a aself.b bif b a:orig super(C, cls)r[cls.instance] 1a C(1, a)b C(1, a)c C(1, b)l [a, b, c]for i in l:if i not in r:r[i] 1else:r[i] 1assert r[a] 2assert r[b] 2assert r[c] 1原题目要求如下&…

【优秀作业】粒子群算法(Python)

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

警惕企业中的五种虚假执行力

第一种虚假执行力&#xff1a;无条件服从——只强调员工“服从”&#xff0c;不强调员工的智慧 很多人讲执行力&#xff0c;很喜欢强调员工的无条件服从。这种观念是OEM(代工生产)制造业时代的产物。实际上这是一种基于“规模制造”的虚假执行力&#xff0c;其本质是把人当成了…

真实记录疑似Linux病毒导致服务器 带宽跑满的解决过程

案例描述 由于最近我在重构之前的APP&#xff0c;需要和server端进行数据交互&#xff0c;发现有一个现象&#xff0c;那么就是隔1~2天总会发生获取数据超时的问题&#xff0c;而且必须要重启服务器才能解决。早在之前&#xff0c;我有留意到这个问题&#xff0c;但是由于这个服…

java集合总结_Java中集合总结

Java数组的长度是固定的&#xff0c;为了使程序能够方便地存储和操作数目不固定的一组数据&#xff0c;JDK类库提供了Java集合&#xff0c;这些集合类都位于java.util包中&#xff0c;但是与数组不同的是&#xff0c;集合中不能存放基本类型数据&#xff0c;而只能存放对象的引…

区块链基本解读

最近看着这个区块链&#xff0c;稍有新得&#xff0c;写下菜鸟自己的理解&#xff0c;希望大牛多多指点。 总体心得&#xff0c;如果互联网技术解决的是通讯问题的话&#xff0c;区块链技术解决的是信任问题。 下面举个日常例子&#xff1a;打赌 比如A和B赌石头是否为天然玉石&…

PDO防注入原理分析以及使用PDO的注意事项 (转)

我们都知道&#xff0c;只要合理正确使用PDO,可以基本上防止SQL注入的产生&#xff0c;本文主要回答以下两个问题&#xff1a; 为什么要使用PDO而不是mysql_connect&#xff1f; 为何PDO能防注入&#xff1f; 使用PDO防注入的时候应该特别注意什么? 一、为何要优先使用PDO? P…