<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## demo 參考 [個人github](https://github.com/idcpj/go_websocket) 參考 [個人 im 帶群聊,發圖片,語音](https://github.com/idcpj/go_IM) ## 推送的高并發解決方案 ### 內核優化 把同一秒內要推送的彈幕,合并成一條,如每條發送10條的數,合并為10條同時發送 ## 鎖瓶頸-優化方案 1. 連接打散到多個集合中,每個集合有自己的鎖 2. 多線程并發推送多個集合,避免鎖競爭 3. 讀寫鎖取代互斥鎖,多個推送任務可以并發遍歷相同集合 ## 單機瓶頸 1. 維護海量長連接會花費不少內存 2. 消息推送瞬時消耗大量CPU資源 3. 消息推送瞬時帶寬高達400~600MB(4-6Gbiⅰts),是主要瓶頸! ## 資源標準化 把圖片,視頻,音頻資源先上傳到服務器,在傳遞 url ## 群聊解決方案 1. 使用縮略圖 2. 使用云服務,如阿里云 ## 心跳機制 1. 每 30s 發送一次 2. 距離最近發送的消息,后的 30s [推薦] ## 降低 cpu 資源的使用 1. 降低 json 編碼頻次 2. 一次編碼多次使用 ## 降低對 io 資源的使用 1. 合并寫數據庫次數 2. 優化對數據庫讀操作 3. 能緩存的就緩存 ## 群聊的 struct 表 ### 方案一 [推薦] 優勢 - 鎖的頻次低,只需要在加入時,clientMap 加鎖 劣勢 - 要輪訓全部map ``` type Node struct { Conn websocket.Conn //找到用戶就可以發送 conn 所以不需要鎖 //并行轉串行, DataQueue chan []byte GroupSets set.Interface //設置人員所在群聊的 id 列表 使用(gopkg.in/fatih/set.v0) } //映射關系表, userid-node 映射表 var clientMap map[int64]Node = make(map[int64]*Node,0) ``` ### 方案二 優勢 - 找用戶ID非常快 劣勢 - 登錄用戶的時,需要給 clientMap 與 comMap 都加鎖 - 發送信息時需要根據userid獲取node,鎖的頻次太高 ``` type Node struct { Conn *websocket.Conn //并行轉串行, DataQueue chan []byte } //映射關系表 var clientMap map[int64]*Node = make(map[int64]*Node,0) //群中的人員userid var comMap map[int64]set.Interface= make(map[int64]set.Interface,0) ``` ## 聊天的 struct ``` type Message struct { Id int64 `json:"id,omitempty" form:"id"` //消息ID //誰發的 Userid int64 `json:"userid,omitempty" form:"userid"` //誰發的 //什么業務 Cmd int `json:"cmd,omitempty" form:"cmd"` //群聊還是私聊 //發給誰 Dstid int64 `json:"dstid,omitempty" form:"dstid"` //對端用戶ID/群ID //怎么展示 Media int `json:"media,omitempty" form:"media"` //消息按照什么樣式展示 //內容是什么 Content string `json:"content,omitempty" form:"content"` //消息的內容 //圖片是什么 Pic string `json:"pic,omitempty" form:"pic"` //預覽圖片 //連接是什么 Url string `json:"url,omitempty" form:"url"` //服務的URL //簡單描述 Memo string `json:"memo,omitempty" form:"memo"` //簡單描述 //其他的附加數據,語音長度/紅包金額 Amount int `json:"amount,omitempty" form:"amount"` //其他和數字相關的 } const ( //點對點單聊,dstid是用戶ID CMD_SINGLE_MSG = 10 //群聊消息,dstid是群id CMD_ROOM_MSG = 11 //心跳消息,不處理 CMD_HEART = 0 ) const ( //文本樣式 MEDIA_TYPE_TEXT = 1 //新聞樣式,類比圖文消息 MEDIA_TYPE_News = 2 //語音樣式 MEDIA_TYPE_VOICE = 3 //圖片樣式 MEDIA_TYPE_IMG = 4 //紅包樣式 MEDIA_TYPE_REDPACKAGR = 5 //emoj表情樣式 MEDIA_TYPE_EMOJ = 6 //超鏈接樣式 MEDIA_TYPE_LINK = 7 //視頻樣式 MEDIA_TYPE_VIDEO = 8 //名片樣式 MEDIA_TYPE_CONCAT = 9 //其他自己定義,前端做相應解析即可 MEDIA_TYPE_UDEF = 100 ) type Node struct { Conn *websocket.Conn DataQueue chan []byte GroupSets set.Interface //把群放入其中 } var clientMap = make(map[int64]*Node, 0) var rw sync.RWMutex ``` ## 分布式 使用 udp + nginx ,參考 [個人 im 帶群聊,發圖片,語音](https://github.com/idcpj/go_IM)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看