日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

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

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

我于2014年開啟即時通訊的開發之路,歷經從服務端到客戶端,從第三方到自研,經歷過諸多的研發難題,都一一破解。現將經驗總結如下,希望對行業內從事IM開發的程序員有所幫助。

一、基礎技術選型

(1)通訊方式

①P2P方式

P2P方式多用于局域網內聊天,這種方式在有種種限制和不便。一方面它只適合在線的點對點消息傳輸,對離線,群組等支持不夠。另一方面由于 NAT 的存在,使得不同局域網內機器互聯難度大大上升,在某些網絡類型(對稱NAT)下無法建立連接。使用P2P方式的軟件在啟動后一般做兩件事情:

1、進行UDP廣播:發送自己信息和接受同局域網內其他端信息。

2、開啟TCP監聽:等待其他端進行連接。

②服務器中轉方式

大部分的互聯網IM產品都采用服務器中轉這種方式進行消息傳輸,相對于P2P的方式,具有有以下的優點:

1、支持更多P2P無法支持或支持不好的業務,如離線消息,群組,聊天室。

2、方便業務邏輯的拓展和新舊版本的兼容,當然它也有自己的問題,就是服務器架構復雜,并發要求高。

通過以上的比較,建議我們在開發IM系統的時候使用服務器中轉的方式。

 

(2)網絡連接方式

IM的網絡連接方式有基于TCP的長連接和基于HTTP短連接兩種:

①基于TCP的長連接

基于TCP長連接則能夠更好地支持大批量用戶,問題是客戶端和服務器的實現比較復雜。也有一些改進,比如下行使用MQTT進行服務器通知/消息的下發,上行使用HTTP短連接進行指令和消息的上傳。這種方式能夠保證下行消息/指令的及時性,但是在弱網絡下上行慢的問題還是比較嚴重,早期的來往就是基于這種方式。

②基于HTTP短連接

常見于WEB IM系統(現在很多WEBIM都是基于WebSocket實現),它的優點是實現簡單,方便開發上手,問題是流量大,服務器負載較大,消息及時性無法很好地保證,對大規模的用戶量支持不夠,適合小型的IM系統。

(3)通訊協議方式

IM常見的協議有:XMPP,MQTT,私有協議。各種協議優缺點情況如下:

①XMPP協議

優點:協議開源,可拓展性強,在各個端(有各種語言的實現,對于前期入門級的開發者是很好的選擇,方便進入IM開發的程序員快速上手。

缺點:XML表現力弱,有太多冗余信息,流量大。

常見案例:Gtalk、新浪微博、Facebook。

②MQTT協議

優點:協議簡單,流量少。

缺點:不是一個專門為IM設計的協議,多使用于推送。

③私有協議

幾乎所有主流的IM App都是使用私有協議。

優點:高效,節約流量(一般使用二進制協議),安全性高,難以破解。

缺點:開發初期沒有現有樣列可以參考,對于參與IM開發的程序員的要求比較高。

常見案例:微信、釘釘。

根據以上的對比,我們得出結果,一個好的協議需要滿足高效、簡潔、節約流量、易于拓展等要求,同時又能夠和當前的開發團隊的技術堆棧匹配,不能選擇一個他們很難上手的。

這里再提一下,我當時開發IM系統的時候,上手用的是XMPP,在使用的過程中發現了很多問題,踩了很多坑。

二、IM系統設計

(1)系統設計原則

①實時性原則

消息實時到達接收方,如果用戶在線,則消息實時到達,如果用戶不在線,則消息在用戶登錄后到達。由于網絡波動,以及移動端操作系統對應用前后臺切換的管理,如何實現用戶連接管理、消息實時推送,推送失敗的處理方式,客戶端重連機制,消息如何補齊等,都需要IM系統考慮。由于TCP開發略微復雜,早期的基于HTTP短輪詢、長輪詢的低效的技術方案,也無法達到實時性的要求。

②可靠性原則

是指我們經常聽到的“消息送達”,通常用消息的不丟失和不重復兩個技術指標來表示。可靠性是要確保消息被發送后,能夠被接收者收到。由于網絡環境的復雜性,以及用戶在線的不確定性,消息的可靠性(不丟失、不重復)是IM系統的核心指標,也是IM系統實現中的難點之一。總體來說,IM系統的消息“可靠性”,通常就是指聊天消息投遞的可靠性(準確的說,這個“消息”是廣義的,因為還存用戶看不見的各種指令和通知,包括但不限于進群退群通知、好友添加通知等,為了方便描述,統稱“消息”)。

從消息發送者和接收者用戶行為來講,消息“可靠性”應該分為以下幾種情況:

1、發送失敗:對于這種情況要感知到,明確反饋給發送方。如果此消息沒有發送成功,發送方可以選擇重試或者稍后再試。

2、發送成功:如果接收方處在“在線”狀態,應該立即收到此消息。如果接收方處在“離線”狀態不能收到消息,一旦上線則立刻收到消息。

3、消息不能重復:簡言之就是發送的一條消息不能被重復收到多次。

③一致性原則

系統中要重視消息的時序問題,不能出現發送的消息順序顛倒的問題。通常出現時序的問題有以下的原因:

1、網絡傳輸延遲導致時序不一致。不同用戶發送的消息到達服務器的延時差異較大,給消息時序性帶來挑戰。早期開發過程中經常會遇到這種問題。

2、分布式系統的出現導致時序不一致。IM系統模塊眾多,接入層、消息邏輯層等、每層都分布式集群化,這些應用分布在不同的機器上,如何保證時序是個難點。

④擴展性原則

擴展性是IM系統后期要考慮的問題,包括功能的擴展,服務器的擴展等,這次就先不展開闡述。

(2)網絡應用框架選型

Mina和Netty都是JAVA領域高性能和高可伸縮性網絡應用程序的網絡應用框架。

Mina是 Apache 組織的項目,它為開發高性能和高可用性的網絡 應用程序提供的框架。當前的Mina版本支持基于 Java NIO 技術的 TCP/UDP 應用程序開發、串口通訊程序。目前正在使用 Mina的 軟件有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(macromedia Flash Media RTMP)、ObjectRADIUS、Openfire等。

Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、 事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。也就是說Netty是一個基于NIO的客戶端和服務器端框架,使用Netty可以確保你快速和簡單的開發出一個網絡應用。

雖然我使用過Mina,但是建議開發選型上使用Netty。因為Netty有對google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi)。Mina更新到2.0就不再更新了,而Netty一直在更新,目前最新發布的版本已經更新到4.1,從版本更新角度可以看出Netty的社區很活躍,修復問題一直在持續,這將對我們選擇它進行開發帶來很多便利。

三、基于Netty架構設計

(1)單體系統架構

單體Netty IM系統,可以支持10萬并發,如果機器性能良好的情況下可以超過10萬。

(2)分布式架構

分布式的Netty IM系統,可以支持更高的并發數。各組件的功能如下:

①IM Server 連接器:主要用來負責維持和客戶端的TCP連接。

②緩存:負責用戶、用戶綁定關系、用戶群組關系的緩存。 緩存臨時數據、加快讀速度。可以做成集群方式。

③數據庫:用戶、群組、離線消息。可以做成集群方式。

④消息隊列:用戶狀態廣播、群組消息廣播。可以做成集群方式。

四、如何快速入手

(1)開發環境

開發環境推薦使用netty-4.1.30這個版本,jdk使用1.8及以上版本。如下所示:

<dependency>

<groupId>io.netty</groupId>

<artifactId>netty-all</artifactId>

<version>4.1.30.Final</version>

</dependency>

(2)組件選擇

①開發框架采用Netty + Spring(Spring4.x)。

②Spring采用Spring cloud。基于restful 短連接的分布式微服務架構,完成用戶在線管理、單點登錄系統。

③消息隊列采用rocketMQ 高速隊列,整流作用。

④數據庫采用MySQL。

⑤協議JSON +自定義數據包采用Fastjson。

(3)參考樣例

基于Netty的IM開源代碼在網上有很多,這里就不列舉了,可以自行去git上下載。我認為關鍵是把概念理清楚,技術堆棧選好,總體框架定好,接下來就是開發一個適合中小企業的IM系統了,但是要考慮到后期的擴展性,因為一個好的產品不能自己用,要讓更多的人使用。

分享到:
標簽:系統 IM
用戶無頭像

網友整理

注冊時間:

網站: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

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