現在的網游無論是手游還是端游,郵件系統幾乎是必備的功能。游戲的郵件系統類似日常使用的郵件,可以是玩家發給玩家的郵件消息,也可以是系統發給玩家的消息,當然更重要的功能是附件(可以發放道具)和群發(可以用於定期活動獎勵發放)。本文介紹的郵件系統基本是本人以往項目中設計的郵件系統的簡化版。
首先,一封郵件存儲的內容大致包括郵件ID,接收者,發送者,發送時間,過期時間,郵件類型,標題,內容,附件內容等。依據對郵件的索引緩存,我們又可以把他們拆分為郵件頭和郵件體兩部分。其中郵件頭將作為索引緩存常駐內存,而郵件體則在玩家讀取郵件或者領取附件時從數據庫檢索。MailID為主鍵,為(ReceiverID,Type) 建立索引,可以快速拉取發給某個人的所有郵件。注意,這里我為郵件分了類型,每一種類型都是單獨處理的。
Head | MailID ReceiverID SenderID SendTime ExpireTime Type |
Body | Title Content ExtraType ExtraData |
把郵件划分了Head和Body,在玩家登錄時,就可以全量拉取發送給該玩家的所有郵件頭,而不用擔心郵件數量過多占用太多內存。假設一個玩家有1000封郵件,假設一個Head占100B,那么該玩家郵件內存占用只有100k。
拉取時,已經過期的郵件可以立即刪除,視情況自動領取附件或者直接刪除。可以為每個玩家的郵件頭緩存按照發送時間排序,按時間順序增量推送給客戶端,視客戶端實現性能,可以只推數十個,翻頁時由客戶端主動請求,增量推送后面的郵件。當有新郵件時,可以通知客戶端數量變化。客戶端主動請求最新的郵件內容。
郵件有單獨的類型,就可以為不同的業務功能提供不同的郵件服務。比如默認的郵件(帶附件),用於支撐聊天的信息,用於特殊業務的獎勵發放,用於特殊業務的常駐內容發送。推給客戶端郵件系統的只有系統郵件和玩家郵件,其余郵件都在服務端處理,在登錄或者某些特殊業務需求下拉取並處理。
Body中帶有Extra信息,附件可以放到Extra內,對於特殊郵件,我們可以把特殊的內容放到Extra內,並根據類型做不同的處理。比如在我之前的項目中,就把發送給玩家的某些rpc,在玩家不在線時通過郵件發送,放到Extra內,這樣在玩家下一次登錄時,對該類郵件直接處理並刪除,解析Extra內的協議,就像直接從另外一台服務器收到rpc消息一樣。
以上都是點對點給玩家發送郵件。批量給玩家發送郵件有另外的服務,按照玩家列表依次給玩家發送郵件,因此並不需要郵件邏輯實現。另外還有一種郵件,發送給所有玩家的廣播,例如讀過就不在顯示的系統消息,或者全服發放某個獎勵,由於時間緊迫,當時尚未實現,可以做個思考。由於注冊玩家可能非常多,給所有玩家都增加一條數據庫記錄是個很費的操作。因此可以考慮一個單獨的廣播郵件記錄,內容除了ReceiverID,其他都一致,過期銷毀。每個玩家維護一個已讀廣播郵件的列表(郵件ID和過期時間),玩家登錄時活着在線定期拉取廣播列表,剔除已讀廣播,剩下的根據類型做相應處理。
基本郵件內容到此就介紹完畢了,基本的思想很簡單,但是真正實現起來還是會遇到一些坑。由於項目還在運營,不便講太多細節,只能談談設計思路。有細節性的問題歡迎討論。