MySQL非同步推送 非同步任務推送的實踐

2021-10-19 03:36:10 字數 2471 閱讀 2247

目錄

初識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 四步 ...