目錄
1、 每秒鐘 5k 個請求,查詢手機號的筆試題,設計演算法?
2、 高并發情況下,我們系統是如何支撐大量的請求的?
3、 集群如何同步會話狀態?
4、 負載均衡的原理?
網站訪問量已經越來越大,回應速度越來越慢,
5、 怎么提高并發量,請列舉你所知道的方案?
6、 系統的用戶量有多少?多用戶并發訪問時如何解決?
7、 如果有一個特別大的訪問量,到資料庫上,怎么做優化?
? 8、 大面積并發,在不增加服務器,如何解決服務器回應不及時問題?
1、 每秒鐘 5k 個請求,查詢手機號的筆試題,設計演算法?
請求再多,比如 5w,如何設計整個系統? 設計出每秒并 5K 的一個系統,根據網上的這個題目做以下梳理,眾所周知一個良好的架構 需要考慮它的高可用和可伸縮,需要做服務的熔斷、降級、隔離等等
架構設計原理:
1、路由網關-流量分發入口,不承載具體業務,簡單點可以使用 nginx,如果是微服務可以使用 zuul 等(支持請求的分發、限流、下游依賴的發現,可以結合 docker 實作服務下游的web 服務自動伸縮),如果采用 nginx 完成不了下游的伸縮發現,但是基本的限流和分發可以解決
2、web 服務-可以水平擴展,通過 cache 加速,查詢手機號碼號段對應的地區,對于快取未命中的號段,直接丟入 kafka 佇列,實時回傳 client 端查詢中的狀態
3、消費微服務-完成 kafka 佇列的消費,根據 kafka topic 的 partition 個數也可以實作水平擴展,負責把發送號段的查詢請求至實時查詢微服務,保存至 cache
4、實時查詢微服務-因為是無狀態服務,根據業務負載也可以實作水平擴展,且僅負責對外部運營商的查詢,根據外部供應商的介面能力,也可以通過 hystrix 把該服務 export 出的介面做限流和熔斷,這樣影響面就不會波及外部合作伙伴
5、快取預熱服務-為提升體驗,減少發出查詢請求后的重繪等待時間,在服務發布前,可以預先把一批號段通過請求實時查詢微服務,并先保存起來 總結如上設計:快取讀取不會形成瓶頸,佇列生產不會形成瓶頸,唯一形成瓶頸的點有可能發生在外部運營商介面,因此我們會對實時查詢服務做限流和熔斷,所以不會壓垮運營商,但是用戶端的體驗就糟些了,所以我們需要把快取預熱的功夫做足,改善體驗,上面的設計在不同場景下需要進行微調,基本思想不會發生大的變化,把請求異步化,一天吃不成胖子,就分多天吃,就是這個意思,當然還考察了服務的隔離、降級、可伸縮的特性!
2、 高并發情況下,我們系統是如何支撐大量的請求的?
1、盡量使用快取技術, 包括用戶快取,資訊快取還有靜態頁面快取,多花點記憶體來做快取,可以大大減少與資料庫的互動次數和 tomcat 執行次數,減少不變的資料重復在 tomcat 和資料庫中獲取的次數,
2、同步轉異步, 對于一些不需要即時結果的操作,可以使用 MQ 訊息機制,達到同步轉異步的效果,如秒殺系統,正常流程:先點擊秒殺,然后往服務器發送請求,在頁面等待回應,這樣融入大量請求,服務器壓力會特別大,搞不好服務器就會宕機,使用 MQ 訊息佇列實作異步的步驟為:點擊秒殺,回傳請稍后查看結果,請求去 MQ 佇列中排隊,等排隊執行完成后回傳給用戶資訊,這樣就可以大大減少服務器的壓力,提升用戶體驗度,
3、合并多個同型別請求為一個請求, 使用 SpringCloud 的 Hystrix 技術來實作,在服務提供者提供了回傳單個物件和多個物件的介面,并且單個物件的查詢并發數很高,服務提供者負載較高的時候,我們就可以使用請求合并來降低服務提供者的負載,
4、資料庫方面, 搭建資料庫集群,網站一般讀的多寫的少,可以按照網站的統計資料來找到一個合適的平衡點,來搭建主從資料庫服務,可以實作一主多從,或者多主多從,來減輕單個資料庫的壓力,可以按照每臺資料庫服務器的硬體條件,合理分配權重,配合 Mycat 達到負載均衡, 5、高質量代碼, 合理的使用回圈和遞回,不要為了速度丟了記憶體,也不要為記憶體丟了速度,要看業務場景,來合理使用,減少自動處理邏輯,比如字串拼接,每次拼接都會創建一個字串放入常量池,這里可以按照業務場景來使用 StringBuilder 或者 StringBuffer 來進行字串拼接,能手動處理就手動處理,代碼中所有的臨時物件,用完之后都賦值為 Null,這樣可以減少 GC 的重復排查,效率就會有所提升,所有的資源用完都要回收,如:IO、資料庫連接物件等,因為這些資源對 GC 不是特別友好,減少代碼呼叫鏈,盡量不要讓代碼呼叫鏈超過 10,遠程方法呼叫沒事,提供過濾能力,把每個過濾器寫的詳細一點,把耦合度高的資料放入到同一個過濾器中,如果第一個過濾器沒有通過那么后面的過濾器不執行,相對的業務也就不執行了,效率也就提升了,
6、網路優化, 外網轉內網,內網轉局域網,外網轉 VPN,配合公司內的網路運維人員,進行網路網段的切換,盡量讓服務器群處于內網,或者局域網中,提供訪問速度,服務器之間的通訊如果都是局域網內進行的,那么可想而知,訪問速度肯定有所提升,
7、中間件處理 搭建 Tomcat 集群,通過 Nginx 代理 Tomcat 服務器做負載均衡,對每個 Tomcat 的調優,合理設定設定 Tomcat 的最大連接數,因為 Tomcat 的默認最大并發數為 200,適當的加大 Tomcat的記憶體和最多執行緒數,設定 JVM 的處置大小為服務器可用記憶體的最大值的 80%,關閉 DNS查詢,開啟 gzip 壓縮, 搭建 MQ 集群,高并發的時候一個 MQ 來處理佇列根本不夠用,這時可以搭建集群來處理,增加 Nginx 的記憶體,加大 Nginx 快取資料的范圍,服務器作業系統都用 64 位的,因為 32 位的系統最大記憶體只能有 4G 圖片服務器分離,搭建 vsftpd 服務器來存盤圖片資料,通過 Nginx 代理 vsftpd 存放路徑就可以直接訪問到圖片,這樣回應到頁面的只是超鏈接,并不是圖片,這樣頁面的回應會得到大大的提升,
3、 集群如何同步會話狀態?
利用 Redis 同步 session Redis 可以做分布式,正式因為這個功能他才可以用來做 session 同步,他可以把 web 服務器中的記憶體組合起來,形成一個“記憶體池”,不管是哪個服務器產生的 session 都可以存放于這個記憶體池中,其它的都可以使用, 以這種方式來同步 session,不會加大資料庫的負擔,安全性比 cookie 要大大提高,把 session放到記憶體中,這樣比從檔案讀取也要快很多,
4、 負載均衡的原理?
網站訪問量已經越來越大,回應速度越來越慢,
考慮: Scale Up(也就是 Scale vertically)縱向擴展,向上擴展:機器硬體升級,增加配置,如添加CPU、記憶體,(往往需要購置新機器)–>舊機器不能利用上,
Scale Out(也就是 Scale horizontally)橫向擴展,向外擴展:向原有的 web、郵件系統添加一個新機器,–>舊機器仍然可以發揮作用,
負載均衡技術為 scale out 服務,
Nginx 負載均衡器的特點是:
1. 作業在網路的 7 層之上,可以針對 http 應用做一些分流的策略,比如針對域名、目錄結構;
2. Nginx 安裝和配置比較簡單,測驗起來比較方便;
3. 也可以承擔高的負載壓力且穩定,一般能支撐超過上萬次的并發;
4. Nginx 可以通過埠檢測到服務器內部的故障,比如根據服務器處理網頁回傳的狀態碼、超時等等,并且會把回傳錯誤的請求重新提交到另一個節點,不過其中缺點就是不支持 url來檢測;
5. Nginx 對請求的異步處理可以幫助節點服務器減輕負載;
6. Nginx 能支持 http 和 Email,這樣就在適用范圍上面小很多;
7. 默認有三種調度演算法: 輪詢、weight 以及 ip_hash(可以解決會話保持的問題),還可以 支持第三方的 fair 和 url_hash 等調度演算法;
5、 怎么提高并發量,請列舉你所知道的方案?
HTML 靜態化 模板引擎
圖片服務器分離 Nginx
資料庫集群、庫表散列 資料分片 Mycat
快取 基于 Redis
鏡像是大型網站常采用的提高性能和資料安全性的方式
負載均衡
CDN 加速技術
6、 系統的用戶量有多少?多用戶并發訪問時如何解決?
分布式是以縮短單個任務的執行時間來提升效率的,而集群則是通過提高單位時間內執行的任務數來提升效率,
集群主要分為:高可用集群(High Availability Cluster),負載均衡集群(Load Balance Cluster,nginx 即可實作),科學計算集群(High Performance Computing Cluster),分布式是指將不同的業務分布在不同的地方;而集群指的是將幾臺服務器集中在一起,實作同一業務,分布式中的每一個節點,都可以做集群, 而集群并不一定就是分布式的,采用微服務架構,使用技術 Spring Cloud 的一站式解決方案
7、 如果有一個特別大的訪問量,到資料庫上,怎么做優化?
1. SQL 陳述句的優化處理 通過慢查詢確認執行效率低下的 SQL 陳述句,進行拆解和索引的控制
2. 為資料庫搭建集群,實作主從復制
3. 實作資料庫的讀寫分離
4. 實作資料的分片處理
5. 采用資料庫中間件 Mycat
8、 大面積并發,在不增加服務器,如何解決服務器回應不及時問題?
衡量服務器的并發能力
1.吞吐率
吞吐率,單位時間里服務器處理的最大請求數,單位 req/s
2.壓力測驗
使用 Jmeter,壓力測驗中關心的時間又細分以下 2 種:
用戶平均請求等待時間(這里暫不把資料在網路的傳輸時間,還有用戶 PC 本地的計算時間 計算入內)
服務器平均請求處理時間
提高服務器的并發能力
1.提高 CPU 并發計算能力
2.考慮減少記憶體分配和釋放
3.考慮使用持久連接
4.改進 I/O 模型
5.Sendfile Linux 提供 sendfile()系統呼叫,可以講磁盤檔案的特定部分直接傳送到代表客戶端的 socket 描述符,加快了靜態檔案的請求速度,同時減少 CPU 和記憶體的開銷,
6.記憶體映射
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299951.html
標籤:其他
上一篇:分布式相關(面試題)
