本文主要關注用哪些技術解決了哪些問題,整理思路
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%9B%BE 系統架構圖
DeltaPub 社群交流項目架構

整個項目建構于 Spring Boot 之上,Spring MVC 處理請求,MyBatis 通路資料庫,Spring Security 管理使用者的權限
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Spring-MVC-%E6%8B%A6%E6%88%AA%E5%99%A8%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Spring MVC 攔截器使用場景
攔截使用者請求,在調用具體方法之前從cookie中擷取憑證,建構使用者認證的結果,存入存入SecurityContext,以便于Security進行授權,并存入 ThreadLocal,請求完成後對ThreadLocal 和 SecurityContext 中的對象進行清理。
- 在請求開始時查詢登入使用者
- 在本次請求中持有使用者資料
- 在模闆視圖上顯示使用者資料
- 在請求結束時清理使用者資料
攔截使用者請求,在調用具體方法之前擷取使用者 IP 和 id 實作資料統計,如統計 UV 與 DAU。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Redis-%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Redis 使用場景
二級緩存:Redis 緩存文章清單資料,當本地緩存查不到時就查詢 Redis。
對性能要求高子產品,需要高頻通路的子產品:
- 關注功能使用了 Redis 的 ZSet 資料結構實作關注清單和被關注清單,将目前時間做為權重,關注時将資料存入 Redis 中,取關時将 Redis 中的資料删除。
- 點贊功能使用了 Redis 的 Set 和 String 資料結構分别存儲實體的贊和使用者的贊,實作實時擷取點贊狀态和數量。
Redis 中的事務是細粒度的,當需要進行增加或删除操作時将事務打開,完成後送出事務。
統計網站 UV 使用了 Redis 的進階資料類型 HyperLogLog,其中日期做 key、IP 做 value 将指定的 IP 計入UV,實作了統計指定日期範圍内的 UV。
統計網站 DAU 使用了 Redis 的進階資料類型 Bitmap,其中日期做 key、userId 做 value 将指定的 使用者 計入UV,通過 OR 運算實作了統計指定日期範圍内的 DAU。
使用 Redis 存儲了使用者的登入憑證,解決了分布式環境下的 Session 的共享。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Kafka-%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Kafka 使用場景
當使用者進行評論、點贊、關注,觸發相應事件,發送到指定主題,事件消費者監聽主題,消費消息發送站内通知。
當使用者進行發帖和删帖時,發送異步消息,事件消費者監聽到消息後,處理事件,包括檢驗格式、記錄日志、對 Elasticsearch 資料庫中的資料進行增删。
當使用者進行分享時,發送異步消息,将上傳檔案與分享功能解耦,實作異步生成長圖。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Elasticsearch-%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Elasticsearch 分布式搜尋引擎使用場景
對文章全文搜尋 使用 Elasticsearch,對文章進行了儲存,搜尋時根據關鍵字對文章的标題和内容檢索,并設定了排序規則和高亮顯示比對到的關鍵詞。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF 多線程與定時任務使用場景
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#ThreadLocal%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%E9%9A%94%E7%A6%BB ThreadLocal實作線程隔離
為什麼用 ThreadLocal,每個浏覽器通路伺服器時,伺服器會建立獨立的線程進行處理請求,伺服器處于多線程的環境,存儲使用者資訊時需要考慮多線程的情況,為了防止并發時産生沖突,将使用者資訊存入 ThreadLocal 實作線程隔離。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Quartz-%E5%88%86%E5%B8%83%E5%BC%8F%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E6%A1%86%E6%9E%B6 Quartz 分布式定時任務架構
使用 Quartz 做定時任務的原因,防止在分布式環境下,不同的伺服器做同樣的任務産生沖突,而 Quartz 是分布式定時任務架構,資料存儲在資料庫中,可以實作分布式環境下的定時任務。
業務中使用 Quartz 定時重新整理文章分數,使用者後續熱度排名。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#%E6%9C%AC%E5%9C%B0%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1-Spring-%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1 本地定時任務 Spring 定時任務
業務中向雲伺服器上傳圖檔采用了 ThreadPoolTaskScheduler,啟用定時器,監視該圖檔,一旦生成了,則上傳至雲伺服器。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Spring-AOP-%E5%92%8C-ControllerAdvice-%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Spring AOP 和 ControllerAdvice 使用場景
ControllerAdvice 實作全局異常處理。
Spring AOP 實作統一記錄日志。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#Spring-%E4%BA%8B%E5%8A%A1%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF Spring 事務使用場景
對文章評論時,需要同步更新文章的評論資料量,設計到兩個實體:評論和文章,修改了兩次資料庫,先添加評論,後更新文章的評論數量。
隔離級别選用 *READ_COMMITTED *解決第二類丢失更新、不可重複讀以及幻讀。
事務傳播行為采用 REQUIRED 支援目前事務(外部事務),如果不存在則建立新事務。
https://izshun.github.io/2020/02/17/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95 資料結構與算法
利用 Trie 實作了發帖、評論時對敏感詞過濾。
利用 StackOverflow 的問答排名算法,計算文章分數,實作文章熱門排名。