目錄
初識swoole
非同步程序介紹
傳統推送業務邏輯
非同步任務推送邏輯
效率對比
初識swoole
swoole是php乙個擴充套件,但和其他擴充套件只提供介面、函式不同,swoole重新定義php,接管並重新處理資料,將處理好的資料返回給php,支援百萬tcp連線,同時支援非同步/同步/協程等功能
非同步worker程序介紹
非同步worker程序是swoole提供的乙個非阻塞程序,投遞乙個非同步任務到非同步程序,執行完畢立即返回,非同步程序可以繼續處理新請求,程序間沒有加鎖爭搶,效能異常優良。利用以上特性,可以用來處理耗時較長的事務。
傳統推送業務邏輯
傳統推送通過設定自動執行,或者手動執行讀取運營後台設定資料,寫入佇列(可選),接著將資料推給第三方,第三方將推送結果告知程式,這個告知的過程通常以對方網路穩定決定了推送效率,推送短板也在這塊。
非同步任務程序推送邏輯
非同步任務運用在從佇列讀取資料過程中,開啟多個程序讀取資料,接著傳送資料給第三方,只要開啟合適數量的程序,推送速度極快。
下面介紹用到技術
easyswoole框架
redis佇列
定時器task程序
話不多說,擼起**就是幹
1、註冊定時器,寫入任務
if ($workerid == 0) {
timer::loop(1 * 1000, function () {
pushlogic::addqueue();
class pushlogic
const redis_key = 'push_list';
public static function addqueue($task)
queue::push(self::redis_key, $task);
2、註冊定時器 獲取任務
if ($workerid == 1) {
timer::loop(5 * 1000, function () {
$share = sharememory::getinstance();
// 啟用16個非同步task程序
if ($share->get(sys::push_task_num) < 16) {
asynctaskmanager::getinstance()->add(pushtask::class);
3、封裝非同步執行邏輯
class pushlogic
conse redis_key = 'push_list';
public static function handle($task)
// 程序資料隔離 檔案鎖 記錄非同步task程序數量
$share = sharememory::getinstance();
$share->starttransaction();
$key = sys::push_task_num;
$share->set($key, $share->get($key) + 1);
$share->commit();
while (true) {
$task = queue::pop(self::redis_key);
// 呼叫gcm或apns邏輯
gcm::send($task);
$share->starttransaction();
$share->set($key, $share->get($key) - 1);
$share->commit();
至此主要功能已處理完畢,具體推送結果可以根據實際情況存入redis、swoole記憶體表、資料庫
注:推送結果不要存在全域性變數或者靜態變數,因為不同程序記憶體隔離
效率對比
系統:cenos release 5.11
cpu: 4核
記憶體:32g
php:7.1
總終端數量:1百萬
單次任務終端數量:1千
傳統推送耗時:30分鐘
非同步多工:3分鐘
easyswoole框架是常駐記憶體,連線資料庫需要採用斷線重連,否則會出現mysql server has gone away,可以參考這裡的使用方法php-mysqli-database-class
獲取任務時,應避免所有非同步任務程序處於忙的狀態。
**不要出現sleep/usleep等睡眠函式,會使程序陷入睡眠阻塞。
禁用exit/die,導致程序退出。
全域性變數、靜態變數、需要自行銷毀,特別要注意array型別的值,必要時清理大陣列,防止記憶體溢位。
非同步 非同步任務
非同步任務 記錄一下學習完springboot後進行使用非同步方法時的筆記 service層 author yesijie date 2019 11 29 15 25 service public class asyncc catch interruptedexception e system.ou...
AsyncTask非同步任務
asynctask非同步任務怎麼寫 寫乙個類繼承asynctask,重寫方法 doinbackgroud 再new 這個類,執行物件 execute 在ui執行緒裡面寫這個類的實現方法 doinbackground有可能是新開的執行緒,有可能是執行緒池裡面的執行緒 執行順序 onpreexecute...
Android AsyncTask非同步任務
asynctask能夠適當地 簡單地用於 ui執行緒。這個類准許執行後台操作,讓那些沒有熟練操作執行緒的操作者在 ui執行緒上發布結果。非同步任務的定義是乙個在後台執行緒上執行,其結果是在 ui執行緒上發表的計算。非同步任務被定義成三種一般型別 params,progress和 result 四步 ...