智聯卓聘IM演進過程

来源:http://www.cnblogs.com/shouhongxiao/archive/2017/07/18/7200253.html
-Advertisement-
Play Games

1. 卓聘IM開發背景 智聯卓聘是智聯旗下高端人才招聘平臺,成立快4年了,業務增漲每年以100%速度增漲,業務增漲快在開發和上線速度要求也比較高。 2016年6月提出IM開發需求,7月初上線,開發人員三名,開發時間20多天,後期可以不斷滿足業務需求。前期階段我們考慮網上各種提供IM的雲平臺,這些平臺 ...


1.  卓聘IM開發背景

 智聯卓聘是智聯旗下高端人才招聘平臺,成4年了,業務增漲每年100%速度增漲,業務增漲快在開發和上線速度要求比較高

 

 20166月提出IM開發需求7月初上線,開發人員三名,開發時間20天,後期可不斷滿足業務前期階段我們考慮網上各種提供IM的雲平臺,這些平臺都有一個問題,聊天記錄管理上,有著各種限制和不方便,所以我們決定自己去完成一個。

一個完整的IM,需考慮通信協議和傳輸協議。通信協議目前XMPPMQTT ...傳輸協議TCPHTTP,下麵我就從前期技術選擇和我們自己在IM開發中遇到問題和如何解決做一些描述。

2.  IM 技術選型

  IM在選擇上,更多我們需要考慮傳輸協議與通信協議使用。一個實時不經常掉線的IM必須有具有穩定可靠通信。

通信協議無非是在UDPTCPHTTP 選擇。傳輸協議最多使用XMPP 它是基於XML,每次一大段XML Post到服務端。如果是PC還好,手機端讓人抓狂。MQTT反而短小,更適合當下,易用、耗能少。不過目前還沒找到使用MQTT協議像Openfire一樣強大的開源項目,就是一但出了問題我們風險無法控制。

 

  以下就是經常被用於IM的相關選擇。

 

2.1  Openfire

  在Openfire 之前,IM開發者們,一邊考慮著通信協議,一邊考慮使用什麼樣傳輸協議,一切從0開始做起,從Openfire開始,IM開發者發現開發IM簡單很多,只要把XMPP協議瞭解了都可以快速開發,無論你是Web、還是手機,都有著不錯開源項目可用。效率也高,後面使用了Mina,想要功能直接寫插件、XMPP協議也適應了當時流行的XML。但這一切只是暫時的。

 

  為了保證通信穩定與安全XMPP協議XML冗餘太長了,我們也有了更高效的Netty可用,關係性資料庫變的不再適合存儲這類數據。 XMPP要傳一張圖變的很痛苦。

 

2.2  WebSocket

  像socket一樣提供了一組API,它基於了HTPP協議,它並不是一套完整IM解決方案。在HTTP熟悉的協議中多了Upgrade: websocketConnection: Upgrade這二項,你的Nginx和新版Tomcat對這二項會有支持。最重要二個函數一個就是Send方法,一個就是Receive,簡單像是我們回到了HTTP RequestResponse。可是最大問題在低版本瀏覽器上不能使用。

 

2.3  長輪詢

  談到長輪詢就不得不說Comet的技術,使的HTTP協議有了主動推送機制。Comet本身有長連接與長輪詢二種方式。但是長連接在IEFirefox 下端的進度欄都會顯示載入沒有完成,而且 IE 上方的圖標會不停的轉動,表示載入正在進行。長輪詢本身技術很簡單,是利用HTTP超時機制,重發,看起來像是與客戶端建立了個永久連接。現在的開源有Comet4jCometD

 

 

  缺點:消息實時性差,每打開一個網頁都要保持一個連接,對伺服器資源消耗大,發一條信息速度還好,如果是一張圖或者大量信息接收時,都會直接影響伺服器資源,在手機上使用不穩定。

      優點:實現簡單、部署成本低相容性好只要可以HTTP請求各種平臺都可以實現,開源多相關解決方案成熟,一但出現問題我們可以第一時間解決。這是最重要的。

 

  在開始做IM之前,我們有幾個需要考慮的自身業務特點需要考慮。

 

  首先,我們需要相容全部瀏覽器

 

  讓我們在客戶端實現方式並不多,WebSocket好用簡單,可PC低版本瀏覽器不能使用。但在手機上又有著廣泛的支持。Openfire Smack可它的協議冗餘太長,要是在客戶端重新定義再到伺服器端轉化,效率不高。要是使用長輪詢如何避免用戶打個過多頁,白白消耗伺服器資源,使用了HTTP協議如何保持它的狀態和集群搭建也是問題。

 

  可以同時線上多種客戶端,離線後可推送。

   手機AppPC瀏覽器也可以同時線上、同時收發信息,我們既要可以在瀏覽器上使用像長輪詢這樣方式,同是也可以在手機上使用WebSocket這樣穩定收發方式。AppPC收,或PCApp收取。而且需要在App退出後,又可以使用推送平臺用戶手機上。

 

3. 卓聘聊聊架構

   在分析了各種方案優缺點、根據我們目前業務需求和後期擴展,我們將架構做瞭如下設計。

   通知服務可以隨時上線、下線,動態註冊在路由規則器中,前端根據需要或長輪詢、或WebSocket,在路由規則器獲取雙方(自己和對方)ID,在通過REST服務發送的數據是帶有ID的報文。通知服務在推給推送服務時,推送服務計算“規則”就可準確推送給指定客戶。客戶接到通知,再次通過REST服務拉取具體內容。

 

 

  架構雖然簡單,可同時也遇到不少問題,以下就是架構詳細介紹及遇到問題和改進方式。

 

4. 存在問題及改進方式

4.1 用戶頻繁線上打開N多頁面產生大量長輪詢

  用戶瀏覽器可以多開同一用戶打開不同瀏覽器、同一用戶每開一個瀏覽器打開N多個每個一個頁,產生一個連接,長輪很消耗服務資源,CometD代碼中,就發現同一用戶會限制長輪詢個數,這是必要的安全減少伺服器資源 但是不能解決實際問題 每個用戶會打開很多頁簽這是用戶習慣問題,我們無法限制。而同過觀察用戶行為平時我們IM在收起狀態時,在整個頁面右下角。(見圖一),用戶本身可能不會主動去操作IM工具,如果能減少這樣不必要連接可以減少50%-60%無用長輪但是有二點要解決用戶不主動點擊登錄IM

   1你的好友可以看到你線上

   2如何收到你的好友推給你的消息

 

  圖一、

 

 

  我們採用了虛擬登錄,你沒有展開時不去開啟長輪,只有點擊展開視窗才真正的長輪

   1用戶頁面載入時,發出你登錄信息,同過心跳保持線上狀態

   2、你的好友推你信息時,我們通過拉取我們採用 Nginx+Lua+Redis ,這樣請求不會打到後面服務

   3、可以將上面二個步驟做成一個連接,減少連接數。

4.2 發送數據大小與接收速度

     最早開始做時我們對IM瞭解比較少,做到一半時測試時,輸入內容越多或隨著業務發展,要求發表情,圖文時,會隨著長度增加接收和發送會有影響,後來同過學習和觀察發現,IM需要推拉同時使用,這也是IM普遍做法,可介紹的人比較少 見下圖好處顯而易見,推送時解析協議獲取到一個個短小命令,而客戶端接到命令再去主動拉去實際內容。

 

  1、發送客戶端把發送內容發到指定Web伺服器。

  2Web伺服器收到後,生成相應指令,和具體發送內容。

  3、分別把指令傳送到接收伺服器,內容直接存放到資料庫中

  4、接收服務收到指令後發送到後面推送服務。

  5、推送服務推到指定用戶。

  6、接收用戶收到指令後,再通過拉取,從資料庫中拉到實際內容。

4.3如何集群

 

     Web集群簡單,因為是無狀態的,用戶每次請求都會被負載到不同伺服器,不會有問題,而IM麻煩就在狀態性,你不可能簡單把它負載到不同伺服器我們使用Hash演算法可以將同一用戶會被分到一臺指定伺服器,同時又出現其它問題,跨伺服器消息傳遞A用戶(AM)機器B用戶(BM)機器 實現如下

 

  路由選擇器保存我們全部用戶及用戶連接,我們可以很輕鬆知道,每個用戶具體指向伺服器。

  1、用戶在登錄時在路由規則器註冊自己。

  2、當A用戶發向B用戶信息時,通過路由規則器找到B對應的推送服務

  3、推送服務相應信息通過Comet推送給指定客戶。

 

4.4 後續遷移

 

  由於前期時間和業務要求,我們很快上線,可我們要考慮後期代碼重構,業務在增長,重構時我們不是推翻重來,我們考慮僅替換瓶頸服務。所以我們將發送服務和推送服務分開,(見下圖)發送介面和定義協議不會變變的成本更高),我們要變的,可以方便增加或替換推送模塊。圖中紅色區域就是可以隨時被我們替換和增加黃色通信協議模塊相對穩定。

 

  1、發送者發送數據時,我們會把內容寫到資料庫把命令發到接收服務中。

  2、命令接收服務可是一個消息中間件,也可以是自己寫一個Netty服務去解析。

  3、把解析後結果再次發到推送服務,推送服務在PC上可能它是一個Web服務,也可能是WebSocket服務,也可以是第三方平臺。當然也可以二種或多種同時存在。

 

 

5. 總結與未來方向

  IM是一種時實要求高的系統,最大問題是用戶是否可以正常登錄,一但登錄,就可以收發信息,而當用戶量和用戶同時線上交流不斷增加時,集群的建設和收發速度都是影響用戶體驗的重要因素。IM中每個用戶狀態,信息敏感度都是必不可少監控項。目前我們也在不斷優化自動擴容、風險監控這些方向。希望給獵頭、企業HR、應聘者提供更好交流方式。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 要求: Readme: 運行程式,輸入薪水,根據商品列表的序號選擇購買的商品,可以選擇多次購買,或者不購買 流程圖: 代碼: ...
  • #列印實心菱形,思路:分上下,i控制行,j控制列印的空格數,k控制列印的*數量row = int(input("please input a raw number: "))for i in range(row): #i控制行數 for j in range(row-1-i):#空格數和行數的關係 p ...
  • XML文件處理 XML文件處理,有好幾種方式,這裡介紹一下xml.etree.ElementTree as ET。 註意:xml.etree.ElementTree模塊在應對惡意結構數據時顯得並不安全。 每個element對象都具有以下屬性: 1. tag:string對象,表示數據代表的種類; 2 ...
  • 一.ServletContext 介面(javax.servlet)定義:public interface ServletContext原理: Tomcat啟動的時候,需要識別webapps下的各個WEB應用,識別各個WEB應用的同時為每個WEB應用創建對應的對象ServletContext,一個W... ...
  • 最近在做ProtoBuf相關的項目,其中用到了動態解析,網上看了下相關資料和博文都比較少,自己來寫一個記錄一下學習過程。 Protocol Buffers是結構化數據格式標準,提供序列化和反序列方法,用於存儲和交換。語言中立,平臺無關、可擴展。目前官方提供了C++、Java、Python API,也 ...
  • 設計模式之單列模式 1,何為單列模式? 即singleton 在某個類採用了單列模式之後 其只能有一個實列對象 ,並且這個實列對象只能有內部自己創建並提供給外部的調用。 2.實現單列模式的方法 分為 :餓漢式 ,懶漢式 下麵為餓漢式實現代碼: 餓漢式 通過創建一個靜態成員變數 在類載入的時候直接創建 ...
  • thinkphp的CBD模式 核心保留了最關鍵的部分,併在重要位置設置了標簽用以標記,其他功能都採用行為擴展和驅動的方式組合,開發人員可以根據自己的需要,對某個標簽位置進行行為擴展或者替換,就可以方便的定製框架底層,也可以在應用層添加自己的標簽位置和添加應用行為。而標簽位置類似於AOP概念中的“切麵 ...
  • 1:項目場景 在設計數據表的時候有時候為了將來統計或查詢的方便,我們會冗餘一些欄位。如有三張數據表,學校信息表、班級動態表、班級信息表。 班級動態由學校老師所發,可以進行評論點贊等操作,為了提升這種非結構化數據的訪問效率,存儲於Mongodb中,冗餘了學校名稱欄位,假設班級表也冗餘了學校名稱欄位。而 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...