簡單列一下分散式高併發要做的事情

資料庫

以MySQL為例。慢查詢日誌,索引最佳化(explain),覆蓋索引。

資料庫一主多從或者雙主多從。讀寫分離。

然後對錶進行垂直劃分,例如一張欄位很多的寬錶轉為子母表。

水平劃分,根據業務特性,對錶進行分割槽(現在應該很少用),分表,甚至分庫。

資料該歸檔的歸檔,日表變月表,年表,或者變地域表等。

使用sharding-jdbc等。

甚至可以給資料庫硬碟換上SSD。

資料量再大,就該考慮大資料了。

快取

以Redis為例。哨兵保證高可用,叢集(最低3主3從)保證吞吐量(相當於MySQL的分庫)。

要注意快取與DB的資料一致性(更新後刪),快取穿透(布隆過濾器),快取雪崩(預熱,隨機時間過期)問題。

還要關注持久化問題,RDB、AOF。

微服務

拆微服務要考慮業務以及團隊情況(開發測試運維管理,不同組間協調),決定拆分粒度。

JVM的調優,儘量避免頻繁GC。

透過執行緒池實現非同步方法,降低邏輯處理的整體時間。

要考慮本地事務、分散式事務,根據業務要求實現強一致性或最終一致性,2PC、TCC、分散式鎖、訊息佇列。

服務要考慮註冊與發現、冪等(全域性請求ID,表唯一索引,樂觀鎖)、熔斷、降級。

閘道器方面還要關注鑑權、限流。

整體要考慮鏈路追蹤,叢集監控、配置中心。

也要適時引入MongoDB或Elasticsearch,應對搜尋的併發,減少資料庫的壓力。

還要引入分散式任務排程,Elastic-job、XXL-job、Quartz等。

訊息佇列

削峰,服務間解耦。

要注意訊息持久化、訊息丟失、重複消費的問題。

運維

CDN快取,伺服器的安全,DDoS,伺服器和服務的規劃編排,持續整合/持續交付,同城雙活,異地災備,兩地三中心。