1. 程式人生 > >socket.io搭建分散式Web推送伺服器

socket.io搭建分散式Web推送伺服器

socket.io是目前較為流行的web實時推送框架,其基於nodejs語言開發,底層用engine.io實現。 藉助nodejs語言非同步的特性,其獲得了不錯的效能。但單個例項的socket.io依然承載能力有限,最多隻能容納3000個long-polling方式的客戶端進行連線。

將socket.io進行分散式擴充套件的難點有兩處:

1. 進行負載均衡時連線必須保證始終連到一個節點上

如果客戶端採用long-polling長輪訓方式進行連線,則每次輪訓都會產生一個新的請求,若不進行限制。就有可能連線到叢集內新的 socket.io節點上,導致異常的發生。

解決方法:使用nginx的ip_hash實現session sticky ,讓客戶端始終連線到叢集內一臺節點上。

2. 多個例項之間的訊息推送

當叢集內某臺節點想要向連線到叢集的所有客戶端傳送訊息時,某些客戶端因為負載均衡時ip_hash可能被分配到了其他的節點上,這時就需要向其他節點發布推送訊息,讓其他節點的同時向客戶端進行推送。

解決方法:使用redis的釋出與訂閱功能與socket.io-redis開源庫,實現節點間訊息推送。

準備安裝的軟體:

nginx, nodejs, redis以及一個socket.io應用,如一個聊天伺服器,例子請見官網這裡

具體步驟:

1.將socket.io應用部署成兩個例項,如在同一臺主機上為每個例項分配不同的埠號4000, 5000:

http.listen(4000, function(){
  console.log('listening on *:4000');
});

2.配置nginx檔案,設定負載均衡proxy

upstream chat_nodes {
        ip_hash;
        server 127.0.0.1:4000;
        server 127.0.0.1:5000;
}

以及反向代理設定 (注意為了支援websocket協議,需將nginx升級至1.3.12版本以上

location / {
        proxy_pass              http://chat_nodes;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "upgrade";
        proxy_http_version      1.1;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

完成配置後,重啟nginx。

3.安裝nodejs模組 socket.io-redis

sudo npm install socket.io-redis

4.在原來socket.io應用中初始化io的位置加入io的redis介面卡:

var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

5. 重啟各個socket.io應用,進行測試。

其他注意點:

由於nginx的反向代理機制和socket.io的自動重連機制,上述架構還具備高可用的特性,即當某個節點down機時,原先連線到該節點上的客戶端會自動重連至其它節點上。

節點的數量可以隨時增減,不需要暫停服務,只需修改nginx配置即可。

nginx的ip_hash是基於ip的前三段進行計算的,也就是說ip只有D段不同的兩臺客戶端一定會連線到同一臺伺服器上,這點測試的時候需要注意。

可以通過redis的訂閱釋出服務來實現其他系統同叢集的通訊,完成叢集的管理工作。

Redis 的詳細介紹請點這裡 
Redis 的下載地址請點這裡

相關推薦

socket.io搭建分散式Web伺服器

socket.io是目前較為流行的web實時推送框架,其基於nodejs語言開發,底層用engine.io實現。 藉助nodejs語言非同步的特性,其獲得了不錯的效能。但單個例項的socket.io依然承載能力有限,最多隻能容納3000個long-polling方式的客戶

利用 socket.io 實現訊息實時

專案背景介紹 最近在寫的專案中存在著社交模組,需要實現這樣的一個功能:當發生了使用者被點贊、評論、關注等操作時,需要由伺服器向用戶實時地推送一條訊息。最終完成的專案地址為:https://github.com/noiron/socket-message-push,這裡將介紹一下實現的思路及部分程式碼。

用node.js(socket.io)實現資料實時

1.setInterval每隔n秒去非同步拉取資料(缺點:更新不夠實時) 2. AJAX輪詢方式方式推送資料(缺點:服務端需要在死迴圈中反覆查詢資料庫) 3.websocket推送資料(缺點:僅支援html5標準的瀏覽器) socket.io的簡要介紹 所有客戶端都通過socket.io掛

code-push-server 搭建自己的伺服器流程

一,server端配置流程 1, 安裝和啟動code-push-server $ git clone https://github.com/lisong/code-push-server.git $ cd code-push-server $ npm insta

Node.js+Socket.io搭建簡單的websocket伺服器

    因為專案原因需要使用websocket這種全雙工的通訊方式,但是在後端伺服器還沒搭建好的情況下,就只能自己搭建一個測試伺服器,下面我將一步步的列舉單間過程; 開發工具:webstorm 1.服務端 第一步:新建一個專案資料夾,開啟webstorm,進入該專案資料

使用express4與socket.io搭建伺服器

首先安裝express4,參考http://www.expressjs.com.cn/starter/generator.html npm install express-generator -g 然後建立express專案 express -e myapp

WebRTC實時通訊系列教程7 使用Socket.IO搭建信令伺服器交換資訊

 PS:如果本文對您有幫助,請點個贊讓我知道哦~ 一、譯文 1、你將學到 使用 npm 安裝 package.json檔案裡的專案依賴執行Node伺服器並使用node-static模組支援靜態資原始檔訪問.使用 socket.io

基於netty-socketio的web服務

hub href 相關 發生 推送消息 數據 特定 使用 github   在WEB項目中,服務器向WEB頁面推送消息是一種常見的業務需求。PC端的推送技術可以使用socket建立一個長連接來實現。傳統的web服務都是客戶端發出請求,服務端給出響應。但是現在直觀的要求是允許

ffmpeg與Linux搭建拉流伺服器

必要工具 Linux OS[4G記憶體,4核,10Mbps外網] yasm-1.2.0.tar.gz ffmpeg-3.0.2.tar.bz2 安裝步驟 1. 將ffmpeg-3.0.2.tar.bz2與yasm-1.2.0.tar.gz下載到目標伺服器上 2. 處理yasm

利用socket.io搭建一個簡易的聊天室

前言 本篇介紹使用node.js模組元件socket.io實現一個非常非常簡易的聊天案例。 本系列文章不對 socket.io 歷史背景做過多闡述,只會通過一個個的案例帶領大家進入socket.io的殿堂,增進小夥伴在socket.io實際開發中的基本使用。 socket.

百度雲伺服器端(php版)

<?php namespace Admin\Controller; use Think\Controller; use Org\Net; class AppController extends Controller{ private $appService;

JavaScript是如何工作的: Web通知的機制

摘要: 如何在Web端推送訊息? 這是專門探索 JavaScript 及其所構建的元件的系列文章的第9篇。 如果你錯過了前面的章節,可以在這裡找到它們: JavaScript是如何工作的:引擎,執行時和呼叫堆疊的概述! JavaScript是如何工作的:深入V8引擎&編寫優化程式碼的5

微信小程式訊息伺服器接入

1、訊息轉發地址填寫,需要注意的是token和encodingaeskey要和專案中配置一致2、URL要實現兩個路由相同的方法但是一個需要時GET另一個是POST,如下,其中TOKEN引數需要與微信後臺配置一致; @ResponseBody @RequestMappin

Netty-SocketIO的Web實戰應用

netty-socketio是一個開源的Socket.io伺服器端的一個java的實現, 它基於Netty框架。可應用於服務端主動推送訊息到客戶端等場景,比如說股票價格變化、k線圖的走勢,和websocket是一個作用,只不過socketio可支援所有的瀏覽器。 專案地址

極光訊息伺服器端開發實現(上)

以前一直使用的極光的手動輸入推送內容然後推送到客戶端,今天遇到了推送頻率比較高且比較有規律的內容,比如事實天氣。這樣就需要用我們自己的伺服器來自動生成推送內容了。 可以看到,上面兩句話很醒目,我們看看它封裝的REST API是個什麼東西,再點進去看看 上面兩句話讀了一

【PWA】web技術

伴隨著今年 Google I/O 大會的召開,一個很火的概念–Progressive Web Apps 誕生了。這代表著我們 web 端有了和原生 APP 媲美的能力。但是,有一個很重要的痛點,web 一直不能使用訊息推送,雖然,後面提出了 Notification API,但這需要網頁持續開啟,這對於常規

# Android 極光伺服器端和移動端

Android 極光推送伺服器端和移動端 這裡是Android 有關伺服器端進行推送和手機客戶端接收的一些簡單的例子 伺服器端採用的是MyEclipse2014,手機端是Android studio 2.0 下面是一個簡單的JSP頁面程式碼 <

極光訊息伺服器端開發實現(下)

前面我們已經實現了通過我們自己的伺服器生成訊息向極光訊息推送伺服器傳送推送訊息的功能,下面我們來看看如何在手機客戶端實現訊息接收。 一、在極光上建立一個測試專案 如上圖所示,下載Android Example 執行效果如圖 下面我們通過原始碼先看看上面的四行顯示Tex

試用第三方webGoEasy

基礎知識:http://www.cnblogs.com/best/archive/2016/09/12/5695570.html 第三方websocket:http://goeasy.io/ 以maven方式接入,值得注意的是,之前配置映象時mirror of 配成了*

使用Node.js+Socket.IO搭建WebSocket 實現多人群聊

今天我們做的就是無重新整理實時多人聊天,最終效果我們可以看下: Node.js Node.js採用C++語言編寫而成,它不是Javascript應用,而是一個Javascript的執行環境,據Node.js創始人Ryan Dahl回憶,他最初希望採用Ruby來寫Node