Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 506, comments - 13, trackbacks - 0, articles - 1

          關于RainbowChat-Web

          ► RainbowChat-Web詳細介紹:http://www.52im.net/thread-2483-1-1.html
          ► 歷史版本更新記錄:http://www.52im.net/thread-2480-1-1.html

          RainbowChat-Web是一套基于MobileIMSDK-Web的網頁端IM系統。

          ▲ 主界面更多截圖點此進入更多演示視頻點此進入

          ▲ 主界面(聊天窗全屏時)更多截圖點此進入、更多演示視頻點此進入

          v4.0 版更新內容

          此版更新內容:

          • 1)[前端] [新增增加了消息“撤回”功能,體驗與微信保持一致(支持3種聊天模式,包含完整的前后端處理邏輯);
          • 2)[前端] [新增增加了刪除聊天消息功能;
          • 3)[前端] [新增增加了設置好友備注(及附屬字段)的功能;
          • 4)[前端/服務端] [優化] 升級MobileIMSDK-Web庫至v5.0版(支持完整消息送達保證機制);
          • 5)[前端] [優化] 將原UI各模塊代碼按js文件分拆,使得代碼更易理解和閱讀;
          • 6)[前端] [優化] 增強了表情功能,且可與APP產品互通;

          增強版的表情功能效果截圖:


          消息“撤回”功能效果截圖:

           

          消息氣泡右鍵功能效果截圖:

          設置好友備注功能效果截圖:

          posted @ 2022-01-15 22:54 Jack Jiang 閱讀(85) | 評論 (0)編輯 收藏

               摘要: 本文由ELab技術團隊分享,原題“淺談WebRTC技術原理與應用”,有修訂和改動。1、基本介紹WebRTC(全稱 Web Real-Time Communication),即網頁即時通信。 是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術方案。從前端技術開發的視角來看,是一組可調用的API標準。 在WebRTC發布之前,開發實時音視頻交互應用的成本是非常昂貴,...  閱讀全文

          posted @ 2022-01-10 16:19 Jack Jiang 閱讀(221) | 評論 (0)編輯 收藏

          本文由融云技術團隊原創分享,原題“聊天室海量消息分發之消息丟棄策略”,內容有修訂。

          1、引言

          隨著直播類應用的普及,尤其直播帶貨概念的風靡,大用戶量的直播間場景已然常態化。

          大用戶量直播間中的實時互動是非常頻繁的,具體體現在技術上就是各種用戶聊天、彈幕、禮物、點贊、禁言、系統通知等實時消息(就像下圖這樣)。

          ▲ 某電商APP的賣貨直播間

          如此大量的實時消息,在分發時如何處理才能不至于把服務端搞垮,而到了客戶端時也不至于讓APP出現瘋狂刷屏和卡頓(不至于影響用戶體驗),這顯然需要特殊的技術手段和實現策略才能應對。

          其實,直播間中的實時消息分發,在技術上是跟傳統的在線聊天室這種概念是一樣的,只是傳統互聯網時代,聊天室同時在線的用戶量不會這么大而已,雖然量級不同,但技術模型是完全可以套用的。

          本文將基于直播技術實踐的背景,分享了單直播間百萬用戶在線量的實時消息分發的技術經驗總結,希望帶給你啟發。

          學習交流:

          - 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM

          - 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK 

          本文已同步發布于:http://www.52im.net/thread-3799-1-1.html

          2、系列文章

          本文是系列文章中的第6篇:

          3、技術挑戰

          我們以一個百萬人觀看的直播間為例進行分析,看看需要面臨哪些技術挑戰。

          1)在直播中會有一波一波的消息高峰,比如直播中的“刷屏”消息,即大量用戶在同一時段發送的海量實時消息,一般情況下此類“刷屏”消息的消息內容基本相同。如果將所有消息全部展示在客戶端,則客戶端很可能出現卡頓、消息延遲等問題,嚴重影響用戶體驗。

          2)海量消息的情況下,如果服務端每條消息都長期存儲將導致服務緩存使用量激增,使得內存、存儲成為性能瓶頸。

          3)在另外一些場景下,比如直播間的房間管理員進行操作后的通知消息或者系統通知,一般情況下這類消息是較為重要的,如何優先保障它的到達率。

          基于這些挑戰,我們的服務需要做一個基于業務場景的優化來應對。

          4、架構模型

          我們的架構模型圖如下:

           

          如上圖所示,下面將針對主要服務進行簡要說明。

          1)直播間服務:

          主要作用是:緩存直播間的基本信息。包括用戶列表、禁言/封禁關系、白名單用戶等。

          2)消息服務:

          主要作用是:緩存本節點需要處理的用戶關系信息、消息隊列信息等。

          具體說是以下兩個主要事情。

          直播間用戶關系同步:

          • a)成員主動加入退出時:直播間服務同步至==> 消息服務;
          • b)分發消息發現用戶已離線時:消息服務同步至==> 直播間服務。

          發送消息:   

          • a)直播間服務經過必要校驗通過后將消息廣播至消息服務;
          • b)直播間服務不緩存消息內容。

          3)Zk(就是 Zookeeper 啦):

          主要作用就是:將各服務實例均注冊到 Zk,數據用于服務間流轉時的落點計算。

          具體就是:

          • a)直播間服務:按照直播間 ID 落點;
          • b)消息服務:按照用戶 ID 落點。

          4)Redis:

          主要作為二級緩存,以及服務更新(重啟)時內存數據的備份。

          5、消息分發總體方案

          直播間服務的消息分發完整邏輯主要包括:消息分發流程和消息拉取流程。

          5.1 消息分發流程

          如上圖所示,我們的消息分發流程主要是以下幾步:

          • 1)用戶 A 在直播間中發送一條消息,首先由直播間服務處理;
          • 2)直播間服務將消息同步到各消息服務節點;
          • 3)消息服務向本節點緩存的所有成員下發通知拉?。?/li>
          • 4)如上圖中的“消息服務-1”,將向用戶 B 下發通知。

          另外,因為消息量過大,我們在在分發的過程中,是具有通知合并機制的,通知合并機制主要提現在上述步驟 3 中。

          上述步驟3的通知合并機制原理如下:

          • a)將所有成員加入到待通知隊列中(如已存在則更新通知消息時間);
          • b)下發線程,輪訓獲取待通知隊列;
          • c)向隊列中用戶下發通知拉取。

          通過通知合并機制,我們可以可保障下發線程一輪只會向同一用戶發送一個通知拉取,即多個消息會合并為一個通知拉取,從面有效提升了服務端性能且降低了客戶端與服務端的網絡消耗。

          PS:以上通知合并機制,在大消息量的情況下,非常適合使用Actor分布式算法來實現,有興趣的同學可以進一步學習《分布式高并發下Actor模型如此優秀》、《分布式計算技術之Actor計算模式》。

          5.2 消息拉取流程

           

          如上圖所示,我們的消息拉取流程主要是以下幾步:

          • 1)用戶 B 收到通知后將向服務端發送拉取消息請求;
          • 2)該請求將由“消息服務-1”節點處理;
          • 3)“消息服務-1”將根據客戶端傳遞的最后一條消息時間戳,從消息隊列中返回消息列表(原理詳見下圖 ▼);
          • 4)用戶 B 獲取到新的消息。

          上述步驟 3 中拉取消息的具體邏輯如下圖所示:

          6、消息分發的丟棄策略

          對于直播間中的用戶來說,很多消息其實并沒有太多實際意義,比如大量重復的刷屏消息和動態通知等等,為了提升用戶體驗,這類消息是可以有策略地進行丟棄的(這是跟IM中的實時聊天消息最大的不同,IM中是不允許丟消息的)。

          PS:直播間中消息分發的丟棄策略,跟上節中的通知合并機制一起,使得直接間海量消息的穩定、流暢分發得以成為可能。

          我們的丟棄策略主要由以下3部分組成:

          • 1)上行限速控制(丟棄)策略;
          • 2)下行限速控制(丟棄)策略;
          • 3)重要消息防丟棄策略。

          如下圖所示:

          我們來逐個解釋一下。

          1)上行限速控制(丟棄)策略:

          針對上行的限速控制,我們默認是 200 條/秒,根據業務需要可調整。達到限速后發送的消息將在直播間服務丟棄,不再向各消息服務節點同步。

          2)下行限速控制(丟棄)策略:

          針對下行的限速控制,即對消息環形隊列(見“5.2 消息拉取流程”中的拉取消息詳細邏輯圖)長度的控制,達到最大值后最“老”的消息將被淘汰丟棄。

          每次下發通知拉取后服務端將該用戶標記為“拉取中”,用戶實際拉取消息后移除該標記。

          拉取中標記的作用:例如產生新消息時用戶具有拉取中標記,如果距設置標記時間在 2 秒內則不會下發通知(降低客戶端壓力,丟棄通知未丟棄消息),超過 2 秒則繼續下發通知(連續多次通知未拉取則觸發用戶踢出策略,不在此贅述)。

          因此消息是否被丟棄取決于客戶端拉取速度(受客戶端性能、網絡影響),客戶端及時拉取消息則沒有被丟棄的消息。

          3)重要消息防丟棄策略:

          如前文所述:在直播間場景下對某些消息應具有較高優先級,不應丟棄。

          例如:直播間的房間管理員進行操作后的通知消息或者系統通知。

          針對此場景:我們設置了消息白名單、消息優先級的概念,保障不丟棄。如本節開始的圖所示,消息環形隊列可以為多個,與普通直播間消息分開則保障了重要消息不丟棄。

          通過上述“1)上行限速控制(丟棄)策略”和“下行限速控制(丟棄)策略”保障了:

          • 1)客戶端不會因為海量消息出現卡頓、延遲等問題;
          • 2)避免出現消息刷屏,肉眼無法查看的情況;
          • 3)同時降低了服務端存儲壓力,不會因為海量消息出現內存瓶頸從而影響服務。

          7、寫在最后

          隨著移動互聯網的發展,直播間的實時消息業務模型和壓力也在不停地擴展變化,后續可能還會遇到更多的挑戰,我們的服務會與時俱進、跟進更優的方案策略進行應對。

          附錄:多人群聊天技術文章

          [1]《IM單聊和群聊中的在線狀態同步應該用“推”還是“拉”?

          [2]《IM群聊消息如此復雜,如何保證不丟不重?

          [3]《移動端IM中大規模群消息的推送如何保證效率、實時性?

          [4]《現代IM系統中聊天消息的同步和存儲方案探討

          [5]《關于IM即時通訊群聊消息的亂序問題討論

          [6]《IM群聊消息的已讀回執功能該怎么實現?

          [7]《IM群聊消息究竟是存1份(即擴散讀)還是存多份(即擴散寫)?

          [8]《一套高可用、易伸縮、高并發的IM群聊、單聊架構方案設計實踐

          [9]《IM群聊機制,除了循環去發消息還有什么方式?如何優化?

          [10]《網易云信技術分享:IM中的萬人群聊技術方案實踐總結

          [11]《阿里釘釘技術分享:企業級IM王者——釘釘在后端架構上的過人之處

          [12]《IM群聊消息的已讀未讀功能在存儲空間方面的實現思路探討

          [13]《企業微信的IM架構設計揭秘:消息模型、萬人群、已讀回執、消息撤回等

          [14]《融云IM技術分享:萬人群聊消息投遞方案的思考和實踐

          本文已同步發布于:http://www.52im.net/thread-3799-1-1.html

          posted @ 2022-01-05 12:04 Jack Jiang 閱讀(163) | 評論 (0)編輯 收藏

               摘要: 本文引用了作者Fundebug的“一文搞懂TCP與UDP的區別”一文的內容,感謝無私分享。1、引言網絡協議是每個搞網絡通信應用開發(比如IM、推送、網關等等)的程序員都必須要掌握的基礎知識,TCP/IP協議簇中有兩個最具有代表性的傳輸層協議——分別是 TCP 和 UDP。有過網絡通信開發經驗的同學們都知道,TCP和UDP協議是平時用的最多的兩種協議,...  閱讀全文

          posted @ 2021-12-29 15:01 Jack Jiang 閱讀(159) | 評論 (0)編輯 收藏

               摘要: 本文作者小傅哥,原題“使用DDD+Netty,開發一個分布式IM(即時通信)系統”。為了提升閱讀體驗,有大量修訂和改動,感謝原作者。0、系列文章《跟著源碼學IM(一):手把手教你用Netty實現心跳機制、斷線重連機制》《跟著源碼學IM(二):自已開發IM很難?手把手教你擼一個Andriod版IM》《跟著源碼學IM(三):基于Netty,從零開發一個IM服務端》《跟著源碼學I...  閱讀全文

          posted @ 2021-12-20 18:21 Jack Jiang 閱讀(193) | 評論 (0)編輯 收藏

          一、更新內容簡介

          本次更新為次要版本更新,進行了若干優化(更新歷史詳見:碼云 Release Nodes)。可能是市面上唯一同時支持 UDP+TCP+WebSocket 三種協議的同類開源IM框架。

          二、MobileIMSDK簡介

          MobileIMSDK 是一套專為移動端開發的原創IM通信層框架:

          • 歷經8年、久經考驗;
          • 超輕量級、高度提煉,lib包50KB以內;
          • 精心封裝,一套API同時支持UDP、TCP、WebSocket三種協議(可能是全網唯一開源的);
          • 客戶端支持 iOS、Android標準JavaH5小程序(開發中..)、Uniapp(開發中..);
          • 服務端基于Netty,性能卓越、易于擴展;??
          • 可與姊妹工程 MobileIMSDK-Web 無縫互通實現網頁端聊天或推送等;??
          • 可應用于跨設備、跨網絡的聊天APP、企業OA、消息推送等各種場景。

          MobileIMSDK工程始于2013年10月,起初用作某產品的即時通訊底層實現,完全從零開發,技術自主可控!

          您可能需要:查看關于MobileIMSDK的詳細介紹。

          三、代碼托管同步更新

          OsChina.net

          GitHub.com

          四、MobileIMSDK設計目標

          讓開發者專注于應用邏輯的開發,底層復雜的即時通訊算法交由SDK開發人員,從而解偶即時通訊應用開發的復雜性。

          五、MobileIMSDK框架組成

          整套MobileIMSDK框架由以下5部分組成:

          1. Android客戶端SDK:用于Android版即時通訊客戶端,支持Android 2.3及以上,查看API文檔;
          2. iOS客戶端SDK:用于開發iOS版即時通訊客戶端,支持iOS 8.0及以上,查看API文檔;
          3. Java客戶端SDK:用于開發跨平臺的PC端即時通訊客戶端,支持Java 1.6及以上,查看API文檔;
          4. H5客戶端SDK:暫無開源版,查看精編注釋版;
          5. 服務端SDK:用于開發即時通訊服務端,支持Java 1.7及以上版本,查看API文檔

          整套MobileIMSDK框架的架構組成:

           另外:MobileIMSDK可與姊妹工程 MobileIMSDK-Web 無縫互通,從而實現Web網頁端聊天或推送等。

          六、MobileIMSDK v6.1.2更新內容 

          【重要說明】:

          MobileIMSDK v6.1.2 為次要版本,進行了若干優化! 查看詳情

          【解決的Bug】:

          1. [Andior/iOS]解決了當網絡斷線后,重傳隊列中的包不增加重次數從而一直重傳的問題;
          2. [iOS] 解決了RMMapper庫中,因重寫父類copyWithZone方法而導致某些工程里的動畫效果不生效的問題!

          【其它優化和提升】:

          1. [Andiord]Andriod端Demo中補全了完整的proguard混淆配置,否則真有人對Demo進行“realease”時,會運行報錯哦;
          2. [iOS] 上一個版本中的Protocal類中忘記補上“sm”字段,現在補上了;
          3. [服務端] 服務端Demo同步為最新工程,之前提交的版本未正確合并最新lib等;
          4. [服務端] 升級log4j2至2.15.0,解決Log4j2遠程代碼執行高危漏洞;
          5. [Andiord]Andriod端SDK和Demo工程的targetSdkVersion提升為30;
          6. [Andriod]Andriod端TCP版協議Netty庫加載方式改為gradle加載;

          【版本地址】:

          https://gitee.com/jackjiang/MobileIMSDK/releases/6.1.2

          posted @ 2021-12-16 22:07 Jack Jiang 閱讀(159) | 評論 (0)編輯 收藏

               摘要: 本文由探探服務端高級技術專家張凱宏分享,原題“探探長鏈接項目的Go語言實踐”,因原文內容有較多錯誤,有修訂和改動。1、引言即時通信長連接服務處于網絡接入層,這個領域非常適合用Go語言發揮其多協程并行、異步IO的特點。探探自長連接項目上線以后,對服務進行了多次優化:GC從5ms降到100微秒(Go版本均為1.9以上),主要gRPC接口調用延時p999從300ms下降到5ms。...  閱讀全文

          posted @ 2021-12-14 14:55 Jack Jiang 閱讀(146) | 評論 (0)編輯 收藏

               摘要: 本文由ELab團隊技術團隊分享,原題“Twitter和微博都在用的 @ 人的功能是如何設計與實現的?”,有修訂。1、引言第一次使用@人功能到現在已經有差不多10年了,初次使用是通過微博體驗的。@人的功能現在遍布各種應用,基本上涉及社交(IM、微博)、辦公(釘釘、企業微信)等場景,就是一個必不可少的功能。最近正好在調研 IM 各種功能的技術實現方案,所以也詳細地了解了下@人功...  閱讀全文

          posted @ 2021-12-08 17:23 Jack Jiang 閱讀(166) | 評論 (0)編輯 收藏

               摘要: 本文由石墨文檔技術杜旻翔分享,原題“石墨文檔 Websocket 百萬長連接技術實踐”,有修訂。1、引言在石墨文檔的部分業務中,例如文檔分享、評論、幻燈片演示和文檔表格跟隨等場景,涉及到多客戶端數據實時同步和服務端批量數據在線推送的需求,一般的 HTTP 協議無法滿足服務端主動 Push 數據的場景,因此選擇采用 WebSocket 方案進行業務開發。隨著石墨文檔業務發展,...  閱讀全文

          posted @ 2021-12-01 12:55 Jack Jiang 閱讀(191) | 評論 (0)編輯 收藏

               摘要: 本文由公眾號“后臺技術匯”分享,原題“基于實踐,設計一個百萬級別的高可用 & 高可靠的 IM 消息系統”,原文鏈接在文末。由于原文存在較多錯誤和不準確內容,有大量修訂和改動。1、引言大家好,我是公眾號“后臺技術匯”的博主“一枚少年”。本人從事后臺開發工作 3 年有余了,其中讓我感觸最深刻的一個項...  閱讀全文

          posted @ 2021-11-27 13:00 Jack Jiang 閱讀(204) | 評論 (0)編輯 收藏

          僅列出標題
          共51頁: First 上一頁 21 22 23 24 25 26 27 28 29 下一頁 Last 
          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 萍乡市| 长治市| 大石桥市| 永登县| 鹤山市| 博客| 新巴尔虎左旗| 社旗县| 恩施市| 体育| 天水市| 上高县| 新安县| 台南市| 宁德市| 安阳市| 会昌县| 阳城县| 曲麻莱县| 西丰县| 台中市| 蓝田县| 梓潼县| 成武县| 辽阳市| 遂宁市| 五常市| 绿春县| 漠河县| 楚雄市| 柘荣县| 玉林市| 海晏县| 江山市| 蒙阴县| 兴仁县| 彰化市| 潞城市| 北安市| 睢宁县| 库伦旗|