亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Swoole webSocket消息服務系統(tǒng)方案設計詳解

 更新時間:2023年03月23日 15:32:09   作者:stark張宇  
這篇文章主要為大家介紹了Swoole webSocket消息服務系統(tǒng)方案設計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

概述

基于Swoole的websocket服務,計劃整合3篇進行技術整理,該服務主要有2個核心業(yè)務,用戶消息服務(消息計數統(tǒng)計)和 客服IM消息系統(tǒng)服務,這篇先說用戶消息服務是怎么設計實現的。

實現方案

用戶消息服務主要有2部分組成,對外使用webSocket長鏈接服務提供給安卓/Ios手機客戶端,web提供服務,對內使用Http服務。

鑒權和緩存周期設置

當服務端攜帶Token來訪問請求webSocket服務,進行用戶中心進行權限驗證,如果權限通過,在本地進行信息緩存,返回給請求端,為了防止緩存雪崩(雪崩就是指緩存同一時間到期),用戶訪問峰值是晚間21-24點這個時間段,峰值大概100w/請求,持續(xù)4個小時左右,但因為用戶中心的緩存時間為7300s,所以這里的過期時間公式:

$uid = $redis->get($token);
$expireTime = 3650 + rand(1, 3000);
$uid = OAuth::getUserInfo($token);
if (!empty($uid) && intval($uid) > 0) {
    //存入緩存時間,過期時間小于 7300s
    $redis->setEx($token, $expireTime, $uid);
}
if($uid && $uid > 0){
    $key = 'token_'.$uid;
    $redis->setEx($key, $expireTime, $token);
}

本地服務的緩存怎么存儲,具體看自己的業(yè)務情況,適合自己的就是最好的。

Http服務

Http服務的安全依賴于服務只針對云服務器內網訪問,主站有服務變更時,異步埋點在功能里,比如有系統(tǒng)消息、評論、站內信等一系列操作的時候,會通過http請求用戶消息服務,設置超時時間,允許丟失部分消息。

1.業(yè)務埋點處理

埋點再操作后異步觸發(fā),超時時間2秒,如果失敗再進行一次重試,如果失敗,其實基本就是服務掛了,局域網處理,性能傳輸成本幾乎為0,這個地方相當于消息的生產方。

public function swooleComment($uid, $data)
{
    $url = $this->swooleUrl . "/api/comment/message";
    $commentUid = empty($data['comment_uid']) ? 0 :  $data['comment_uid'];
    $msg = [
        "uid" => $uid,
        "msg" => json_encode(['comment_uid' => $commentUid])
    ];
    $res = Curl::posturl($url, http_build_query($msg), $this->_headerQArr, 2);
    if ($res === false) {
        // 請求失敗再重試一次
        usleep(100000);
        $res = Curl::posturl($url, http_build_query($msg), $this->_headerQArr, 2);
    }
    return $res;
}

2.消息處理

Swoole有一個缺點就是如果沒有建立websocket服務,就不能實時進行通信,所以這個地方我分兩步處理,根據消息類型進行管理和消息的推送,存入redis list結構的隊列中,使用Crontab,執(zhí)行定時腳本處理。

設計方案為快慢2條雙隊列結構,快隊列主要處理當前最新的消息,如果用戶超過1天不上線,放入延遲隊列執(zhí)行,用戶超過超過15天未登錄,消息釋放。

websocket的心跳時間是300s,所以crontab 4min,執(zhí)行一次,延遲隊列6分鐘執(zhí)行一次,我們的redis使用的是鏈接池單節(jié)點特點,整個服務都在依賴,所以這樣設計的方案。

3.數據存儲

數據使用Mysql存儲,Uid進行分表取模,采用分表的初衷是因為當時已經有300w+的用戶,消息多,所以采用分表設計,所有的操作依賴于uid這個變量,所有的操作都采用TaskManager異步操作,以保證最大的性能。

protected function _getTableName(int $uid): string
{
    $tableIndex = intval($uid % 128);
    return 'user_push_msg_' . $tableIndex;
}
protected function addAsyncMysql( array $pushMsg,  int $uid): ?bool
{
    $tableName = $this->_getTableName($uid);
    if (empty($pushMsg) || empty($tableName) || empty($uid)) return false;
    TaskManager::getInstance()->async(function () use ($pushMsg, $tableName) {
        DbManager::getInstance()->invoke(function (ClientInterface $client)
        use ($pushMsg, $tableName) {
            $model = PushMsgModel::invoke($client, $pushMsg);
            $model->tableName($tableName)->save();
        }, self::MYSQL_CONN_NAME);
    });
}

用戶消息數統(tǒng)計

在業(yè)務中有全體用戶,全體作者,簽約作者等分組的情況,成為統(tǒng)計中的重點和難點,一共分分2步解決。

**第一步,**在http消息接收端專門放置一個消息計數器對用戶單條發(fā)送的消息進行計數,只統(tǒng)計針對用戶的消息。

**第二步,**新建一個mysql表,專門用于統(tǒng)計用戶最近查看消息的時間戳,根據用戶最后的查看消息時間來統(tǒng)計群組中的未讀消息數,把兩個結果進行相加,得出用戶未讀消息數和。

表的設計用uid做主鍵,保持用戶的唯一性,使用REPLACE INTO進行更新,REPLACE INTO的好處是如果主鍵uid存在,更新時間,如果不存在則新增數據。

CREATE TABLE `table` (
  `uid` int(10) unsigned NOT NULL DEFAULT '0',
  `unixtime` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶查看消息最新時間'

以上就是Swoole webSocket消息服務系統(tǒng)方案設計詳解的詳細內容,更多關于Swoole webSocket消息服務的資料請關注腳本之家其它相關文章!

相關文章

  • php教程之魔術方法的使用示例(php魔術函數)

    php教程之魔術方法的使用示例(php魔術函數)

    這篇文章主要介紹了php的魔術方法的使用示例(php魔術函數),需要的朋友可以參考下
    2014-02-02
  • laravel框架 api自定義全局異常處理方法

    laravel框架 api自定義全局異常處理方法

    今天小編就為大家分享一篇laravel框架 api自定義全局異常處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • ThinkPHP3.2.3框架郵件發(fā)送功能圖文實例詳解

    ThinkPHP3.2.3框架郵件發(fā)送功能圖文實例詳解

    這篇文章主要介紹了ThinkPHP3.2.3框架郵件發(fā)送功能,結合圖文與實例形式詳細分析了基于thinkPHP框架進行郵件發(fā)送的相關原理、配置及操作技巧,需要的朋友可以參考下
    2019-04-04
  • PHP實現用戶異地登錄提醒功能的方法【基于thinkPHP框架】

    PHP實現用戶異地登錄提醒功能的方法【基于thinkPHP框架】

    這篇文章主要介紹了PHP實現用戶異地登錄提醒功能的方法,基于thinkPHP框架結合用戶session實現異地登陸的判定功能,非常具有實用價值,需要的朋友可以參考下
    2018-03-03
  • 淺談PHP檢查數組中是否存在某個值 in_array 函數

    淺談PHP檢查數組中是否存在某個值 in_array 函數

    下面小編就為大家?guī)硪黄獪\談PHP檢查數組中是否存在某個值 in_array 函數。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • php中通過curl模擬登陸discuz論壇的實現代碼

    php中通過curl模擬登陸discuz論壇的實現代碼

    PHP支持的由Daniel Stenberg創(chuàng)建的libcurl庫允許你與各種的服務器使用各種類型的協議進行連接和通訊。libcurl目前支持http、https、ftp、 gopher、telnet、dict、file和ldap協議
    2012-02-02
  • thinkPHP實現簽到功能的方法

    thinkPHP實現簽到功能的方法

    這篇文章主要介紹了thinkPHP實現簽到功能的方法,實例分析了mysql數據表的構造及thinkPHP簽到功能的具體實現技巧,需要的朋友可以參考下
    2017-03-03
  • thinkPHP批量刪除的實現方法分析

    thinkPHP批量刪除的實現方法分析

    這篇文章主要介紹了thinkPHP批量刪除的實現方法,結合實例形式分析了thinkPHP實現批量刪除數據的數據庫及模板操作相關技巧,需要的朋友可以參考下
    2016-11-11
  • Laravel相關的一些故障解決

    Laravel相關的一些故障解決

    這篇文章主要給大家介紹了關于Laravel相關的一些故障的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Laravel具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • 你可能不知道PHP get_meta_tags()函數

    你可能不知道PHP get_meta_tags()函數

    這篇文章主要介紹了你可能不知道PHP get_meta_tags()函數,比較實用的一個函數了,小編也是第一次看到它,需要的朋友可以參考下
    2014-05-05

最新評論