IM面試題

1.消息存儲中,內容表和索引表如果需要分庫處理,應該按什麼字段來哈希? 索引表可以和內容表合併成一個表嗎?

答: 內容表應該按主鍵消息ID來哈希做分庫分表處理,這樣便於定位某一條具體的消息;索引表應該按索引的用戶UID來哈希做分庫分表處理,這樣可以使得當前用戶的所有聯繫人都落在一張表上,減少遍歷所有表的麻煩。 索引表可以與內容表合成一張表,好處是顯而易見的,能減少拉取歷史消息時的數據庫IO,不好的地方就是消息內容冗餘存儲,浪費了空間。

2.能從索引表裏獲取到最近聯繫人所需要的信息,爲什麼還需要單獨的聯繫人表呢?

答: 如果從索引表中獲取一個用戶的所有聯繫人信息(包括最後一條聊天內容和時間)的話,SQL語句中會有分組後取top 1的操作,性能不理想; 另外當前用戶與單個聯繫人之間的未讀數需要維護,用聯繫人表的一個字段來存儲,比用索引表方便許多。

3.TCP 長連接的方式是怎麼實現“當有消息需要發送給某個用戶時,能夠準確找到這個用戶對應的網絡連接”?

答: 首先用戶有一個登陸的過程: (1)tcp客戶端與服務端通過三次握手建立tcp連接;(2)基於該連接客戶端發送登陸請求;(3)服務端對登陸請求進行解析和判斷,如果合法,就將當前用戶的uid和標識當前tcp連接的socket描述符(也就是fd)建立映射關係; (4)這個映射關係一般是保存在本地緩存或分佈式緩存中。 然後,當服務端收到要發送給這個用戶的消息時,先從緩存中根據uid查找fd,如果找到,就基於fd將消息推送出去。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章