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%活躍度的話,此方案和現有方法無區別。