欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

概述

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

實現(xiàn)方案

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

鑒權(quán)和緩存周期設(shè)置

當(dāng)服務(wù)端攜帶Token來訪問請求webSocket服務(wù),進(jìn)行用戶中心進(jìn)行權(quán)限驗證,如果權(quán)限通過,在本地進(jìn)行信息緩存,返回給請求端,為了防止緩存雪崩(雪崩就是指緩存同一時間到期),用戶訪問峰值是晚間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);
}

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

Http服務(wù)

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

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

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

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服務(wù),就不能實時進(jìn)行通信,所以這個地方我分兩步處理,根據(jù)消息類型進(jìn)行管理和消息的推送,存入redis list結(jié)構(gòu)的隊列中,使用Crontab,執(zhí)行定時腳本處理。

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

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

3.數(shù)據(jù)存儲

數(shù)據(jù)使用Mysql存儲,Uid進(jìn)行分表取模,采用分表的初衷是因為當(dāng)時已經(jīng)有300w+的用戶,消息多,所以采用分表設(shè)計,所有的操作依賴于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);
    });
}

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

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

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

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

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

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消息服務(wù)系統(tǒng)方案設(shè)計詳解的詳細(xì)內(nèi)容,更多關(guān)于Swoole webSocket消息服務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    php中通過curl模擬登陸discuz論壇的實現(xiàn)代碼

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

    thinkPHP實現(xiàn)簽到功能的方法

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

    thinkPHP批量刪除的實現(xiàn)方法分析

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

    Laravel相關(guān)的一些故障解決

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

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

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

最新評論