Caddy 實戰(八)- 利用緩衝提升反向代理的性能

上一篇 Caddy 實戰(七)| 反向代理中的健康檢查 已經爲你介紹了 Caddy 如果通過健康檢查,來確保一個上游(後端)服務是可用的,今天呢,就爲你介紹 Caddy 如何通過緩衝提高反向代理的性能,降低上游服務的負載。

什麼是緩衝

反向代理是客戶端和後端服務之間的橋樑,所以這裏面就有 2 個鏈接:

  1. 客戶端到 Caddy 代理服務的鏈接

  2. Caddy 代理服務到上游(後端)服務的鏈接

假如沒有緩衝,Caddy 會把後端服務的數據直接傳輸到客戶端,如果客戶端到 Caddy 的速度比較慢,後端服務就會一直被這個客戶端佔用;如果有多個客戶端這樣,那麼後端服務的負載就會比較大,處理客戶端的響應就會比較慢,甚至出現無響應超時的情況。

而 Caddy 的反向代理中的緩衝就是解決這個問題的,通過它可以提升效率。

Caddy 的緩衝配置

在 Caddy 中,反向代理的緩衝配置只有 4 個,配置格式如下所示:

reverse_proxy [<matcher>] [<upstreams...>] {
    # backends
    to <upstreams...>
    ...
    # streaming
    flush_interval <duration>
    buffer_requests
    buffer_responses
    max_buffer_size <size>
}

也就是 streaming 的這部分,下面分別說明他們的作用:

  1. flush_interval : 它定了一個時間,表示 Caddy 應該多久把響應的緩衝數據 flush 到客戶端。如果是 -1 ,表示立即 flush,沒有任何緩衝的時間。通過它 Caddy 可以控制相應數據分發的節奏。這裏需要注意的是,如果請求內容類型 text/event-stream 或者沒有指定內容長度的 HTTPS 協議,那麼該值將自動被設置爲 -1 。原理使用的是 time.AfterFunc 這個延遲執行函數。

  2. buffer_requests :如果設置,表示啓用 Request Body 的緩衝,Caddy 會把 Request Body 放到一個緩衝器中,然後把緩衝器中的 Request Body 發給上游(後端)服務。因爲要緩衝,所以會影響效率,一般只有在上游服務需要立即讀取 Request Body(不允許有延遲)的時候才啓用。

  3. buffer_responses :和buffer_requests 一樣,只不過它是把上游服務的響應放到緩衝器中,它對提升上游服務的處理性能有很大幫助。

  4. max_buffer_size :爲以上兩個啓用的緩衝器設置的最大大小,也就是最大緩衝器中只能存放這麼多數據。

示例演示

只看配置可能會有點枯燥,現在我們通過一些配置示例,來看下他們的用法。

reverse_proxy /api/* node1:80 node2:80 node3:80 {
    flush_interval 1s
    buffer_responses
    max_buffer_size 4k
}

以上配置表示啓用了上游服務的響應緩衝,並且設置緩衝器的大小爲 4kb。 flush_interval 設置爲 1s 表示每隔 1s 向客戶端 flush 一次上游服務的響應。
注意這裏的buffer_responses 是沒有值的,它是一個 bool 類型的設置,只要有buffer_responses 這個設置,就表示爲 true ,buffer_requests 也一樣。

小結

Caddy 作爲一個 Web 服務器,的確功能強大,這篇主要是控制數據庫的傳輸和緩衝,下一篇,將爲你介紹,在反向代理中,Caddy 如何控制客戶端以及上游服務的頭信息。

本文爲原創文章,轉載註明出處, 歡迎掃碼關注公衆號flysnow_org或者網站 asf http://www.flysnow.org/ ,第一時間看後續精彩文章。覺得好的話,請猛擊文章右下角「好看」,感謝支持。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/SKGrPCp239dcQi1rGKPZWQ