1. 程式人生 > >設定超時時間真的很重要

設定超時時間真的很重要

概述


一條慢SQL導致購物車服務無法使用一文中,提到了客戶端呼叫購物車服務的時候,超時了。如果當時客戶端沒有設定超時時間的話,會在客戶端中產生級聯故障。先用一張圖來說明一下。

在這裡插入圖片描述

聚合層除了呼叫購物車微服務,還呼叫了營銷系統微服務。如果購物車服務的介面響應時間很慢,而客戶端聚合層呼叫購物車服務時,又沒有設定超時時間,那麼將佔有大量的連線,如果請求購物車服務的請求量比較大,瞬間就會把連線佔用完,直接導致聚合層呼叫營銷系統時,需要阻塞住等待獲取連線,這樣的話,整個小程式的很多功能就都用不了了。

從這裡我們可以看到,最終小程式端會整體響應很慢,因為它呼叫了聚合層,而聚合層又呼叫了一個性能很差的購物車服務。產生級聯故障了,小程式端和聚合層都在等待中耗盡了資源,這個是非常可怕的事情。


設定超時時間


聚合層是使用了Spring Cloud Ribbon,我們可以設定一下Ribbon的超時時間。具體的可以參看SpringCloud Edgware.SR3版本-Ribbon的timeout設定

ribbon:
  ReadTimeout: 2000
  ConnectTimeout: 2000

這樣的話,聚合層呼叫購物車服務,如果兩秒鐘沒有返回結果,則超時報錯。這樣做有兩個好處。

  • 快速失敗,釋放資源;
  • 聚合層呼叫購物車雖然失敗了,但是聚合層呼叫營銷系統則仍然可以進行,不受影響。小程式端使用到營銷系統介面的功能也能繼續使用;

知識擴充套件


客戶端保持彈性真心很重要,因此像客戶端中的

  • 負載均衡模式
  • 斷路器模式
  • 後備模式
  • 艙壁模式

都是需要了解的。要做一個彈性客戶端,可以藉助一些工具,像NetflixHystrix元件就非常不錯,並且已經被Spring Cloud整合進去了,使用起來也比較簡單。