百萬級用戶量的 站內信設計

 

1. 方案描述
該方案用於系統站內信功能模塊在百萬級用戶量情況下的效率問題,只是後臺管理員給前臺用戶發送站內信,用戶與用戶之間的發送不在討論內。
2. 方案詳情
假設系統的用戶量達到了200W,活躍用戶爲10W,系統後臺管理員要給全體用戶發送一條感謝信,如果按照之前的存儲方式,消息隊列需要插入200W條數據,可是除了活躍的10W用戶,其他用戶都忘了自己有該網站的賬號,他都有可能不再登陸該網站了,數據庫保存的消息隊列無意義了。

  現表結構如下:

消息表
編號    ID    NUMBER
標題    TITLE    VARCHAR2(50)    50      
正文    CONTENTS    VARCHAR2(1000)   
最新創建人    FCU    VARCHAR2(50)    50     
更新人    LCU    VARCHAR2(50)    50 
創建時間    FCD    DATE          
最新更新時間    LCD    DATE   

信息有效截止時間 deadlinedate DATE     
刪除標記    DELETE_TAG    CHAR(1)    1  

 

發送表

編號    ID    NUMBER
消息編號    ID    NUMBER 
發送狀態    STATUS    NUMBER   
發送日期    SEND_DATE    DATE     
發送方式    SEND_TYPE    NUMBER 

 

 

消息容器


編號    ID    NUMBER     
站內信ID    MESSAGE_ID    NUMBER  
收件人ID    MEMBER_ID    NUMBER   
是否已讀    READ_STATUS    NUMBER   


會員表

主鍵    id    NUMBER        
會員編號    u_number    NUMBER   
電子郵箱    u_email    VARCHAR2(200)    200    
密碼    u_passwd    VARCHAR2(50)    50     
企業認證    company_admit    NUMBER(1)    1      
帳號禁用    帳號禁用    NUMBER(1)    1      
創建人    FCU    NUMBER  
最後更新人    LCU    NUMBER   
首次創建時間    FCD    DATE      
最後更新時間    LCD    DATE       
刪除標記    DETELE_TAG    char(1)    1 
    


在儘量不改變表結構的前提下,改變一下程序寫數據庫的方式:
後臺管理員發送一條站內信,接收對象爲全體會員,系統往站內信表插入一條站內信,其中發送方式區分接收的對象(0爲全體發送,1爲只發送給註冊會員,2爲只發送給企業會員,3爲指定會員發送),這樣,發送給全體會員的一條站內信暫時只生成了一條數據。

前臺會員登陸的時候,根據會員自身的會員類型(普通會員,企業會員)查詢站內信表中屬於自己的最新消息(根據自己所持消息的最新時間與消息表的發送時間做比對),往消息容器中插入自身與所持消息的關聯數據,默認未未讀,在前臺會員點擊某一條未讀站內信的時候,將容器中的對應站內信狀態改爲已讀。

如果後臺管理員只指定發送站內信給某幾個會員,則往站內信表插入一條站內信後,將這幾個會員與該站內信的關聯直接往消息容器中寫關聯,不需要前臺會員取。
另:因爲改變了發送接收方式,後臺管理員只指定發送站內信給某幾個會員,但是站內信狀態未未發送,只是保存草稿,需要往站內信主表增加一個字段,保存指定會員的id串,用於關聯此草稿與指定會員的關聯,此處就要求發送給指定會員的數量不能太多,需要限制。
這樣,百萬級用戶量的系統,活躍度爲10%的用戶登陸系統,只生成了10W的數據,用戶活躍度越低,此方案效率越明顯,如果是100%活躍度的話,此方案和現有方法無區別。

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