大背景:電商網站,首頁,商品詳情頁,搜尋結果頁,廣告頁,促銷活動,購物車,訂單系統,庫存系統,物流系統
小背景:商品詳情頁,如何用最快的結果将商品資料填充到一個頁面中,然後将頁面顯示出來
分布式系統:商品詳情頁,緩存服務,+底層源資料服務,商品資訊服務,店鋪資訊服務,廣告資訊服務,推薦資訊服務,綜合起來組成一個分布式的系統
1 電商網站的商品詳情頁系統架構
1.1 小型商品詳情頁系統

1.2 大型商品詳情頁系統
大型電商網站商品詳情頁的系統設計中,當商品資料發生變更時,會将變更消息壓入消息隊列中。
緩存服務從消息隊列中消費這條消息時,感覺到有資料發生變更,便通過調用資料服務接口,擷取變更後的資料,然後将整合好的資料推送至 redis 中。
Nginx 本地緩存的資料是有一定的時間期限的,比如說 10 分鐘,當資料過期之後,它就會從 redis 擷取到最新的緩存資料,并且緩存到自己本地。
使用者浏覽網頁時,動态将 Nginx 本地資料渲染到本地 html 模闆并傳回給使用者。
雖然沒有直接傳回 html 頁面那麼快,但是因為資料在本地緩存,是以也很快,其實耗費的也就是動态渲染一個 html 頁面的性能。如果 html 模闆發生了變更,不需要将所有的頁面重新靜态化,也不需要發送請求,沒有網絡請求的開銷,直接将資料渲染進最新的 html 頁面模闆後響應即可。
在這種架構下,我們需要保證系統的高可用性。
如果系統通路量很高,Nginx 本地緩存過期失效了,redis 中的緩存也被 LRU 算法給清理掉了,那麼會有較高的通路量,從緩存服務調用商品服務。但如果此時商品服務的接口發生故障,調用出現了延時,緩存服務全部的線程都被這個調用商品服務接口給耗盡了,每個線程去調用商品服務接口的時候,都會卡住很長時間,後面大量的請求過來都會卡在那兒,此時緩存服務沒有足夠的線程去調用其它一些服務的接口,進而導緻整個大量的商品詳情頁無法正常顯示。
這其實就是一個商品接口服務故障導緻緩存服務資源耗盡的現象。
1.3 頁面模闆
将資料動态填充/渲染到一個html模闆中,是什麼意思呢?
<html>
<title>#{name}的頁面</title>
<body>
商品的價格是:#{price}
商品的介紹:#{description}
</body>
</html>
上面這個就可以認為是一個頁面模闆,裡面的很多内容是不确定的,#{name},#{price},#{description},這都是一些模闆腳本,不确定裡面的值是什麼?
将資料填充/渲染到html模闆中,是什麼意思呢?
{
"name": "iphone7 plus(玫瑰金+32G)",
"price": 5599.50
"description": "這個手機特别好用。。。。。。"
}
<html>
<title>iphone7 plus(玫瑰金+32G)的頁面</title>
<body>
商品的價格是:5599.50
商品的介紹:這個手機特别好用。。。。。。
</body>
</html>
上面這個就是一份填充好資料的一個html頁面
2 緩存服務
緩存服務,訂閱一個MQ的消息變更,如果有消息變更的話,那麼就會發送一個網絡請求,調用一個底層的對應的源資料服務的接口,去擷取變更後的資料
将擷取到的變更後的資料填充到分布式的redis緩存中去
高可用這一塊兒,最可能出現說可用性不高的情況,是什麼呢?
就是說,在接收到消息之後,可能在調用各種底層依賴服務的接口時,會遇到各種不穩定的情況
比如底層服務的接口調用逾時,200ms,2s都沒有傳回; 底層服務的接口調用失敗,比如說卡了500ms之後,傳回一個報錯
在分布式系統中,對于這種大量的底層依賴服務的調用,就可能會出現各種可用性的問題,一旦沒有處理好的話
可能就會導緻緩存服務自己本身會挂掉,或者故障掉,就會導緻什麼呢?
不可以對外提供服務,嚴重情況下,甚至會導緻說整個商品詳情頁顯示不出來
緩存服務接收到變更消息後,去調用各個底層依賴服務時的高可用架構的實作。
3 架構結構
圍繞着緩存服務去拉取各種底層的源資料服務的資料,調用其接口時,可能出現的系統不可用的問題
從簡
spring boot,微服務的非常快速,非常好用的技術架構,脫胎于spring,具體的東西就不講解,直接帶着大家上手搭建一個spring boot的架構
2個服務,緩存服務,商品服務,緩存服務依賴于商品服務
模拟各種商品服務可能接口調用時出現的各種問題,導緻系統不可用的場景,然後用hystrix完整的各種技術點全部貫穿在裡面
解決了一大堆設計業務背景下的系統不可用問題,hystrix整個技術體系,知識體系,也就講解完了
消息隊列,redis,咱們都不搞了
spring boot + http client + hystrix
參考
- 《Java工程師面試突擊第1季-中華石杉老師》