xmpp 高併發下問題猜想及解決方案

2021-09-08 16:25:53 字數 933 閱讀 2538

以tigase作為二次開發系統,以100w活躍使用者作為基本使用者,對高併發問題進行猜想。

問題2、說明一下你如何估算伺服器需要的頻寬。

解答:就拿100w活躍使用者來算,

a、在1vs1聊天中,平均對半分可組成50w個二人組,按照互動模式【即,你說一句,我說一句,而不是同時說】來計算,平均一條聊天記錄15個字,按照手速計算,乙個人每秒手機打字3個,平均一條聊天記錄5秒。

即,此種情況下,聊天記錄的傳送的併發為 50w/(15/3) = 10w條記錄/秒。

併發為10w。按照乙個250b這樣計算,每秒的上行速度應該為:25mb。

b、在群組聊天情況下,假設乙個群為100人,即可組成沒有重複參與人員的群組1000個,考慮到有重複**的情況,將重複**係數設定為5,即,有群組5000個,在互動式聊天【即你一句我一句,都是看了其他人的發言之後才說話的】情景下,平均一條記錄15個字,一秒打字3個,所以5秒發出一條聊天記錄,考慮到有同時回應上乙個發言人,即搶答的情況存在,將搶答係數定義為5,即乙個群組每5秒鐘5條記錄,所以,5000個群一秒鐘的併發為5000.可見群聊天的併發要遠遠低於1對1聊天。

解答:該問題與聊天併發息息相關。

直接拿問題2答案中計算1vs1的併發來進行前提假設。假設每條聊天記錄為15個字,每秒有10w條記錄。於是。。。額,離線聊天記錄必然要儲存在資料庫裡面,然而沒有哪乙個資料庫敢說自己單機併發過萬的,更不要說10w併發了。

不過,我們有辦法。即使單機資料庫也能撐住這個併發,假設資料庫併發可達到1000每秒,那麼,

在系統中新增乙個redis快取層,做乙個佇列,每次聊天記錄進來以後,不直接傳送到資料庫,而是進入redis佇列中,只有 滿足一下任意乙個條件才能入資料庫 1、聊天記錄在3秒內 達到5000條–批量儲存到資料庫,清空佇列;2、聊天記錄不為零,且數量小於5000條,但時間超過了3秒–批量儲存到資料庫,請空佇列。

這樣看的話,10w記錄只需要200次插入操作。

高併發下快取失效問題

快取穿透 指查詢乙個一定不存在的資料,由於快取是不命中,將去查詢資料庫,但是資料庫也無此記錄,我們沒有將這次查詢的null寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義 風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰 解決 null結果快取,並加入短...

高併發下快取失效問題

1.快取穿透 查詢乙個一定不存在的資料,由於快取一定不命中,將查詢資料庫,並且沒有將null寫入快取,這將導致這個不存在的資料每次請求都到儲存層查詢。風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰。解決方案 null結果快取,並加入短暫過期時間。2.快取雪崩 指設定快取時key採用...

高併發下快取常見問題及處理

在日常開發過程中,為了提高查詢速度,我們通常會用到本地快取或分布式快取。特別是在高併發場景下使用分布式快取會遇到很多問題。主要可以歸為如下幾種 接下來就看一看如何處理這些常見問題。快取通常對資料庫資料快取。而分布式快取,還會存在主從結點。從結點會再同步主結點資料。因此在這種情況下訪問快取就可能導致快...