豆瓣連接html
實驗java
業務設計原則node
接入層、反向代理、負載均衡,通常都是指Nginxpython
若是修改upstream,比較麻煩,須要重啓nginx。動態負載均衡就是能夠自動發現上游服務器,而後經過管理後臺,快速註冊或者摘取上游服務器mysql
流程nginx
好處是節點的註冊和摘除,能夠在管理後臺完成,不須要手動操做nginx配置和重啓。
缺點是上游服務須要有consul功能,不知道python有沒有,java有redis
流程算法
缺點是隻能按期,不能長鏈接,因此有延遲,解決方法是nginx暴露一個http api,開發一個agent,長輪詢監聽consul_server的配置變化,而後調用http api實時更新nginx的配置sql
感受上面兩個方案都有點蛋疼。。。。若是有msalt,能夠本身作個管理後臺,修改配置後,發送msalt任務,msalt本身修改nginx配置,而後reload數據庫
上面的都是http的負載均衡,那tcp鏈接,就要用四層負載均衡(7層網絡模型,tcp在第4層)
隔離是發生故障後,將故障服務和正常服務隔離,避免故障服務影響正常服務,形成滾雪球。
都是java的組件,
隔離的思路是
http { limit_conn_zone $binary_remote_addr zone=addr:10m; # 定義限流模塊addr 以ip地址做爲key;10m表示使用10m內存來進行ip傳輸;除了binary_remote_addr 表示ip外,server_name表示域名 limit_conn_log_level error; #限流日誌,觸發限流會打error日誌 limit_conn_status 503; #限流時返回的http code server { location /limit{ limit_conn addr 1; #定義addr模塊限流1 } } }
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s location /limit{ limit_req zone=one burst=5 nodelay; }
觸發分爲降級(打開降級開關)和降級後的恢復(關閉降級開噶)
降級開關,其實也就是一個配置,這個配置的實現能夠:
書中介紹了使用Hystrix來實現降級
具體作法是
本身項目的作法
代理層主要就是Nginx了
Nginx有有不少超時,或者重試的配置
下面的time是時間,例如能夠是5s
Keep-Alive:timeout=10
例如redis,mysql的鏈接都要設置好超時時間
系統雪崩:整個系統所有不可用
雪崩效應:因爲一個小問題,致使整個系統不可用。例如整個系統都依賴於一個非核心業務,可是沒有作好降級,致使一旦這個業務不可用,致使全部核心業務都不可用。
壓測後,就知道系統的性能,就能根據預期負載來決定是否須要優化性能或者增長機器
當上面兩步都作了,項目上線後,仍是會有一些突發狀況,對於這些突發狀況,須要作好預案。
一個預案須要有
例如
預案名稱 | 問題描述 | 執行操做 | 相關人員 |
---|---|---|---|
機房故障 | 機房網絡不可用 | DNS配置中摘掉該機房的IP | 小A |
主要講java的進程內緩存。可是如今基本都用redis緩存了,感受須要用進程內緩存的場景很少了。
瀏覽器中Ctrl+F5能夠強制刷新緩存
使用緩存能大幅提高系統的QPS,可是要注意下面幾點:
多級緩存有(從用戶端到後端),緩存離用戶越近越好:
池化技術用於建設一些消耗,來提高性能。例如避免TCP鏈接和端口,避免線程建立和消耗
通常有指標:
坑
書上說的異步是指處理多個IO請求的並行問題,因此這個叫並行合適點。
解決方法是從串行改成並行,可是就算改成並行,仍是須要阻塞一個線程,在java中,是有線程池的, 可是沒有協程,因此仍是會形成一個線程的浪費。
隊列的做用:
主要講京東幾個業務的實現架構