Forsun高性能高精度定時服務,輕鬆管理千萬級定時任務。
項目地址: https://github.com/snower/forsunmysql
在實際項目中,存在大量須要定時或是延時觸發的任務,好比電商中,延時須要檢查訂單是否支付成功,是否配送成功,定時給用戶推送提醒等等,常規作法是用 crontab 每分鐘掃碼數據看是否到達時間,繁瑣且擴展性伸縮性較差。linux
使用 forsun 服務,能夠簡單的針對每個訂單建立一個定時任務,配合異步隊列,能夠輕鬆實現擴展性伸縮性,Apache Thrift 的編程接口也能夠很容易的和 celery、laravel 配合。 laravel
其餘場景下,好比失敗延時重試,使用 forsun 定時服務也能夠很簡單就能夠實現。git
使用pip自動安裝github
pip install forsun
幫助redis
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 service optional 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_LEVEL log level (defaul: INFO) --driver DRIVER store driver mem or redis (defaul: mem) --driver-mem-store-file STORE_MEM_STORE_FILE store mem driver store file (defaul: /tmp/forsun.session) --driver-redis-host DRIVER_REDIS_HOST store reids driver host (defaul: 127.0.0.1) --driver-redis-port DRIVER_REDIS_PORT store reids driver port (defaul: 6379) --driver-redis-db DRIVER_REDIS_DB store reids driver db (defaul: 0) --driver-redis-prefix DRIVER_REDIS_PREFIX store reids driver key prefix (defaul: forsun) --driver-redis-server-id DRIVER_REDIS_SERVER_ID store reids driver server id (defaul: 0) --extension-path EXTENSION_PATH extension path --extension EXTENSIONS extension name
使用內存持久化存儲啓動:sql
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持久化存儲啓動:shell
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 service positional 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\'"
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。
回調thrift接口時,固定請求void forsun_call(1:string key, 2:i32 ts, 3:map<string, string> params)該函數,第三個params參數即爲任務定義時的params值。