簡易評論系統設計
需求分析
評論系統是互聯網社區網站的重要組成部分,對增強用戶參與度、提高網站活躍度等方面都具有重要價值。
一個簡易的評論系統(在線社區平臺)通常包含以下功能
-
用戶評論:用戶可以對某個產品、主題進行評論,包括文字評論。
-
評論展示:所有用戶的評論將會在產品或服務頁面下方展示,其他用戶可以查看。
-
評論的展示有多種組織方式,參考《評論系統的幾種展示結構和存儲設計》,本文主要針對常見的二級嵌套評論的組織形式。
-
評論回覆:用戶可以對其他用戶的評論進行回覆,形成互動。
-
評論審覈:爲了防止惡意評論或者垃圾信息,系統需要有審覈機制,對用戶的評論進行審覈。
-
評論排序:用戶可以根據時間、評分等因素對評論進行排序。
設計概要
實體分析
基於前面的需求分析,一個簡易的評論系統,一般會包含三個實體:
-
User:自然人,發表主題和評論的人
-
Subject: 主題,用戶發表的主題,被評論的對象
-
Comment: 評論或回覆,評論和回覆需要歸屬於某個 Subject。評論系統中最核心的實體。
模塊設計
-
Comment-BFF:
BFF 層,用於接收和處理來自 C 端用戶的請求(包括讀、寫評論),並返回結果。
如果是寫操作,會通過 MQ 來進行削峯填谷,由 Comment-Service 作爲 MQ 消費者,進行真正的寫動作。
-
Comment-Service:
評論數據的核心邏輯處理服務,
-
消費 Kafka 中用戶的寫入消息,寫入 MySQL,並緩存到 Redis 中,方便用戶的快速讀取。
-
當 Cache Miss 時,處理用戶的讀請求,從 MySQL 中讀取數據,更新緩存,並返回給用戶。
-
Comment-Admin:
評論的管理服務,(置頂、刪除、檢索等)。
存儲設計
僅列出與評論相關的關鍵字段
用戶表t_user
帖子表t_post
comment_count
和root_comment_count
用於記錄評論總數和根評論總數,避免每次都需要count(*)
評論表t_comment
reply_to_comment_id
和reply_to_user_id
只有噹噹前評論是對二級評論的回覆是時爲非NULL
,因爲我們的評論系統是二級嵌套結構,因此被回覆的評論和當前評論在組織形式上是同級的,而非父子結構。
性能設計
緩存設計
-
熱門數據緩存:對於訪問頻率高的數據,如熱門帖子的評論,可以將其緩存到內存中,如使用 Redis 等內存數據庫。當用戶請求這些數據時,可以直接從緩存中獲取,而不需要查詢數據庫。
-
分頁緩存:對於評論列表的分頁查詢,可以將每頁的數據緩存到內存中。當用戶請求某一頁的數據時,可以直接從緩存中獲取,而不需要查詢數據庫。
-
延遲寫入:對於寫操作,如用戶發表評論,可以先將數據寫入緩存,然後異步地將數據寫入數據庫。這樣可以提高寫操作的響應速度。
-
緩存預熱:在系統啓動或者在低峯期,可以預先將可能被訪問的數據加載到緩存中,這樣在高峯期可以直接從緩存中獲取數據。
分庫分表
當單表存儲的數據量級過大時,會影響查詢性能,可以進行一定的分表。
評論通常不會脫離帖子本身存在,因此評論表可以根據post_id
哈希值將數據分佈到多個表中。
讀寫分離:
將讀操作和寫操作分發到不同的數據庫服務器上。例如,可以設置一臺數據庫服務器專門處理寫操作,其他服務器處理讀操作。這樣可以提高系統的併發處理能力。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/5-MrTxFwCJXvn9rdeLDm2Q