Java 高併發思路

cj96248發表於2019-02-28

此文記錄了自己學習Java 高併發思路的基礎知識,紀念自己面試前的準備。

在這裡插入圖片描述

擴容

垂直擴容(縱向擴容):提高系統部件能力
水平擴充套件(橫向擴容):增加更多系統成員

讀操作擴充套件

memcache、redis、CDN

寫操作擴充套件

Cassandra、Hbase等

快取

快取的特徵

  • 命中率:命中數/(命中數+沒有命中數)
  • 最大元素(空間)
  • 清空策略:FIFO(先進先出)、LFU(最少使用)、LRU(最近使用時間)、過期時間

快取命中率的影響因素

  • 業務場景、業務需求
  • 快取的設計(粒度、策略)
  • 快取的容量和基礎設施

快取的分類和應用場景

  • 本地快取:程式設計實現(無法共享)Guava Cache
  • 分散式快取:Memcache、Redis

Redis快取

快取一致性

快取併發

快取穿透

快取雪崩

訊息佇列

訊息佇列的特性

  • 業務無關:只做訊息分發
  • FIFO:先投遞先到達
  • 容災:節點的動態增刪和訊息的持久化
  • 效能:吞吐量提升,系統內部通訊效率提高

為什麼需要訊息佇列

  • 生產個消費的速度或穩定性等因素不一致

訊息佇列的好處

  • 業務解耦
  • 最終一致性
  • 廣播
  • 錯峰與流控

訊息佇列 Kafka

應用拆分

應用拆分的原則

  • 業務優先
  • 循序漸進(拆分、測試)
  • 兼顧技術(重構、分層)
  • 可靠測試

應用拆分落地實現-微服務

應用限流

限流演算法

  • 計數器法
  • 滑動視窗
  • 漏桶演算法 Leaky Bucket
  • 令牌桶演算法 Token Bucket

服務降級、服務熔斷

服務降級

如果服務處理不了了,就返回一個預設值

  • 自動降級:超時、故障

降級 VS 熔斷

  • 共性:目的相同、最終表現一致
  • 區別:觸發原因不同、實現方式不同

Hystrix

資料庫切庫、分庫、分表

資料庫瓶頸

  • 單個庫資料量太大:多個庫
  • 單個庫伺服器壓力大,讀寫瓶頸:多個庫
  • 單個表資料量過大:分表

高可用技術手段

  • 任務排程系統分散式:elastic-job + zookeeper
  • 主備切換:apache curator + zookeeper(分散式鎖)
  • 監控報警機制

相關文章