亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

項目中有即時聊天的需求,經過調研我們采用了socket.io自己實現了一個聊天服務器。

開始的一段時間由于用戶不是很多,消息的發送接收都還算流暢,最近隨著在線用戶數量飆升,每過一段時間就會發生發送消息卡頓和接收消息延時的問題,最后只能通過重啟socket服務來暫時解決問題。

那有沒有辦法從根本上解決這個問題呢?

目錄

  1. 什么是socket.io?
  2. socket.io實現一個簡易的即時聊天應用
  3. socket.io支持分布式部署嗎?
  4. 總結

什么是socket.io?

在介紹什么是socket.io之前,不得不先提一下WebSocket。

我們都知道HTTP協議是一種單向的網絡通信協議,服務端只能被動響應來自客戶端的請求,卻不能主動向客戶端推送數據。

WebSocket技術沒有出現之前,如果要開發一個需要實時獲取服務端數據的Web應用,常見有以下兩種方式:ajax輪詢Long Polling。

  • ajax輪詢的原理其實很簡單,就是讓客戶端每隔一小段時間就主動向服務端發送一次請求,如果有新數據客戶端就把它顯示出來。
  • 可以看出不管有沒有新數據,ajax輪詢都會定時向服務端發起請求,這會導致服務端不必要的性能消耗,Long Polling就是對ajax輪詢的一種改進??蛻舳讼蚍斩税l送請求,服務端不會立即就響應客戶端而是會先保持住此次連接,直到有新的數據時才會返回,客戶端接收到數據之后再立即發送一個新的請求給服務端,并不斷得重復這一過程。

可以看出這兩種方式都需要不斷的建立連接,但是建立連接是一個比較消耗性能的操作,這個時候如果有一個新的通信協議可以支持客戶端和服務端雙向通信就好了,所以WebSocket應運而生。

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

WebSocket是html5新增的一種通信協議。WebSocket協議是一種支持雙向通信的協議,它和HTTP協議一樣通過TCP來進行數據傳輸,但是WebSocket又不同于HTTP:

  • WebSocket是一種支持雙向通信的協議,雙方在建立連接后都能主動向對方發送或接收數據。
  • 客戶端和服務端要想進行WebSocket通信必須先握手交換信息,成功之后才能進行通信。

說了這么多,那么WebSocket跟socket.io又是什么關系呢?

一直以來我都以為socket.io只是WebSocket協議的一種實現而已,深入之后才發現這種觀點不完全正確。

socket.io是一個基于Node.js技術和WebSocket協議開發的實時的,可雙向通信的和基于事件的的開源通信框架。

WebSocke是HTML5新推出的協議,主流瀏覽器對它的支持還不是很完善,所以socket.io不僅僅實現了WebSocket協議,除此之外它還支持一些其他的通信方式,比如前面我們提到的ajax輪詢和Long Polling等,可以根據瀏覽器的支持程度切換不同的通信方式。

用socket.io實現一個簡易的即時聊天應用

接下來我們就是使用socket.io來實現一個簡易的即時聊天的web應用。

先來看一下效果:

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

下面簡單介紹一下實現方式,主要分為客戶端和服務端兩個部分。

服務端核心代碼:

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

服務端主要定義了3個監聽事件,分別用來監聽客戶端的加入群聊、發送消息和離開群聊事件,服務端在監聽到事件后會再通過broadcast.emit方法將消息向全體用戶廣播。

客戶端核心代碼:

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

主要流程:

  1. 向socket服務端請求連接;
  2. 自己向服務端發送加入群聊請求;
  3. 監聽服務端廣播的其他用戶加入群聊消息;
  4. 監聽服務端廣播的用戶聊天信息;
  5. 監聽服務端廣播的用戶離開群聊消息;

socket.io支持分布式部署嗎?

socket服務端維護連接是一個十分消耗性能的操作,那么大量的連接必然會給服務器帶來非常大的性能壓力,當單臺socket服務器支撐不了時該怎么辦呢?

解決方案其實也很簡單:分而治之,我們可以將多個socket服務端組成負載均衡集群,再將連接平均分配到每個服務端。

有人也許會提出疑問:多個socket服務端之間怎么通信?比如用戶1連接到了socket服務端1,用戶2連接到了socket服務端2,那么用戶1發的消息怎么廣播到socket服務端2呢?

這里就需要提一下redis了,對你沒看錯,就是那個用作緩存的Redis。

其實Redis除了當作緩存使用之外,它還有一個非常厲害的功能:發布/訂閱

Redis的發布訂閱機制包括三個部分:發布者、訂閱者和頻道。 發布者將消息發送到某個頻道,那么Redis服務器就會主動將消息推送到訂閱了這個頻道的所有訂閱者。

socket.io正式利用Redis的發布訂閱機制來支持分布式部署的:

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

當客戶端1通過emit觸發了一個事件到socket服務端1,socket服務端1將這個消息發送到Redis的某個頻道,訂閱了這個頻道的socket服務端2就會收到這個消息,socket服務端2再向連接它的用戶廣播就行了。

代碼增加reidssocket.io-redis模塊:

websocket連接太多導致服務器卡頓怎么辦?一招輕松實現橫向擴展
 
 
 

總結

socket.io是一個基于Node.js技術和WebSocket協議開發的實時的,可雙向通信的和基于事件的的開源通信框架。除此之外它還兼容ajax輪詢和Long Polling等前后端通信方式,我們可以根據瀏覽器的支持程度進行自由切換。

socket.io非常適合客戶端和服務端需要進行實時通信的場景,它利用Redis的發布訂閱機制可以實現分布式部署,這讓socket服務端橫向擴展變得很加容易。

 

分享到:
標簽:服務器
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定