高性能千萬級定時任務管理服務forsun使用詳解

Forsun高性能高精度定時服務,輕鬆管理千萬級定時任務。
項目地址: https://github.com/snower/forsunmysql

  • 使用 linux 系統定時器提供精確到秒級的定時調度,長時間運行保證無偏差。
  • 支持本地內存存儲和 redis 持久化存儲,使用 redis 可輕鬆管理數千萬定時任務。
  • 支持命令行建立刪除任務,支持Apache Thrift接口調用建立和刪除更新定時任務信息。
  • 支持 shell、http、redis、thrift、beanstalk、mysql 六種到時觸發回調方式,並能夠經過擴展輕鬆自定義回調器。

背景

在實際項目中,存在大量須要定時或是延時觸發的任務,好比電商中,延時須要檢查訂單是否支付成功,是否配送成功,定時給用戶推送提醒等等,常規作法是用 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\'"

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...

相關文章
相關標籤/搜索