《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

前言算法

前陣子有網友詢問,如何優化網站?這個問題真的很大,跟他簡單的聊了一下,隨便說了幾點,以爲有必要整理一篇文章出來,正好前陣子在作爬蟲博客,因而把大致思路分享出來,與你們互通有無,共同進步。sql

優化數據庫

版本一apache

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

系統開始是這樣子的,一個 Tomcat 拖着一個 MySql 服務,跑在一個 2C 4G 的Linux服務器上,全部的請求都走 Tomcat,全部的查詢都走 MySql,看起來像一句廢話?後端

資源是有限的,那麼如何有效的利用資源,提高服務性能?Tomcat 號稱能抗住數十萬併發訪問,可是這事也得分場景,還得有足夠牛逼的機器。緩存

Tomcat 優化bash

Tomcat支持如下三種模式:服務器

  • BIO:一個線程處理一個請求,缺點:併發量高時,線程數較多,浪費資源,Tomcat7或如下在Linux系統中默認使用這種方式。
  • NIO:利用Java的異步IO處理,能夠經過少許的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。Tomcat7 必須修改Connector配置來啓(conf/server.xml配置文件):
<Connector port="8080" 
 protocol="org.apache.coyote.http11.Http11NioProtocol" 
 connectionTimeout="20000"
 redirectPort="8443"/>複製代碼
  • APR(Apache Portable Runtime):從操做系統層面解決io阻塞問題。Linux若是安裝了apr和native,Tomcat直接啓動就支持apr。

爲了方便易用這裏咱們選擇NIO模式,小夥伴們直接下載使用 Tomcat8 以上版本便可,鏈接池什麼的通常使用默認的便可。微信

版本二架構

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

可能部分小夥伴知道 Tomcat 容器處理靜態請求的性能力並不強,因此這裏須要一款能處理靜態文件請求又超牛逼的服務,這裏推薦 Nginx,固然你可使用其變種 Tengine、OpenResty 才實現動靜分離。

版本三

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

後端服務連接資源是寶貴的,在高併發下,會拖慢整個系統的響應時間。這裏咱們能夠把一些熱點數據進行緩存,後端讀取緩存,若是數據存在則直接返回,不然再去讀取數據庫。

版本四

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

資源是有限的,但用戶多是無限的,還可能有一些惡意用戶、爬蟲、熱點搜索。爲了大部門用戶能夠正常訪問,這裏咱們使用前置限流,經過令牌桶算法或者漏桶算法實現多樣的限流方案。

版本五

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

在博客系統中,爲了提高響應速度,加入了 Redis 緩存,把文章主鍵 ID 做爲 key 值去緩存查詢,若是不存在對應的 value,就去數據庫中查找 。這個時候,若是請求的併發量很大,就會對後端的數據庫服務形成很大的壓力。這裏咱們使用布隆過濾器對空命中進行攔截處理。

終極版

《集羣、限流、緩存 BAT 大廠無非也就是這麼作的》

  • 若是僅僅對於一個博客而已一個Nginx 足夠了,後面能夠帶多個Tomcat 作負載均衡進羣
  • Nginx 應用層面作限流,後端單個服務能夠作接口限流
  • 後端服務用戶 Session 能夠集中存儲到 Redsi 中
  • 布隆過濾攔截防止緩存穿透
  • 熱點數據讀取 Redis 緩存
  • 若有必要 Redis 、MySql 能夠作主從集羣

小結

優化過程可能僅僅是冰山一角,但大致思路差很少就是這個樣子,發現問題而後解決問題,原本架構就是演進而來的。

獲取資料:

本次給你們分享一些學習資料,裏面包括:(高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)以及Java進階學習路線圖。

領取方式:加微信號 weixing99ting 便可獲取。最後,祝你們早日學有所成!

相關文章
相關標籤/搜索