你還在手寫定時器麼?那你就OUT了

微信公衆號:老夫擼代碼
本期:你還在手寫定時器麼?那你就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/

運行效果

登錄界面
主界面

結尾

如果童鞋們在使用過程中遇到困難,直接在公衆號中留言,老夫儘可能提供幫助。
關注微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章