您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關FastCGI 中怎么利用Cache實現服務降級,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
架構圖如下:
Degradation
實現的關鍵點在于通過error_page處理異常,并且完成服務降級:
limit_conn_zone $server_name zone=perserver:1m; error_page 500 502 503 504 = @degradation; fastcgi_cache_path /tmp levels=1:2 keys_zone=degradation:100m inactive=10d max_size=10g; upstream php { server 127.0.0.1:9000; server 127.0.0.1:9001; } server { listen 80; limit_conn perserver 1000; server_name *.xip.io; root /usr/local/www; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { set $cache_key $request_method://$host$request_uri; set $cache_bypass "1"; if ($arg_degradation = "on") { set $cache_bypass "0"; } try_files $uri =404; include fastcgi.conf; fastcgi_pass php; fastcgi_intercept_errors on; fastcgi_next_upstream error timeout; fastcgi_cache degradation; fastcgi_cache_lock on; fastcgi_cache_lock_timeout 1s; fastcgi_cache_valid 200 301 302 10h; fastcgi_cache_min_uses 10; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_key $cache_key; fastcgi_cache_bypass $cache_bypass; add_header X-Cache-Status $upstream_cache_status; add_header X-Response-Time $upstream_response_time; } location @degradation { rewrite . $request_uri?degradation=on last; } }
插播一個小技巧:設置域名時用到了xip.io,有了它就不用設置hosts了,方便調試。
代碼里用到的都是Nginx缺省包含的功能,我們可以看作是一個通用版,不過對照我們架構圖中的目標就會發現:它沒有實現全局激活緩存的功能。如何實現呢?最簡單的方法就是通過單位時間內出錯次數的多少來判斷系統健康以否,設置相應的閾值,一旦超過限制就全局激活緩存,通過Lua我們可以實現一個定制版:
lua_shared_dict fault 1m; limit_conn_zone $server_name zone=perserver:1m; error_page 500 502 503 504 = @degradation; fastcgi_cache_path /tmp levels=1:2 keys_zone=degradation:100m inactive=10d max_size=10g; upstream php { server 127.0.0.1:9000; server 127.0.0.1:9001; } init_by_lua ' get_fault_key = function(timestamp) if not timestamp then timestamp = ngx.time() end return os.date("fault:minute:%M", timestamp) end get_fault_num = function(timestamp) local fault = ngx.shared.fault local key = get_fault_key(timestamp) return tonumber(fault:get(key)) or 0 end incr_fault_num = function(timestamp) local fault = ngx.shared.fault local key = get_fault_key(timestamp) if not fault:incr(key, 1) then fault:set(key, 1, 600) end end '; server { listen 80; limit_conn perserver 1000; server_name *.xip.io; root /usr/local/www; index index.html index.htm index.php; location / { rewrite_by_lua ' if ngx.var.arg_degradation then return ngx.exit(ngx.OK) end local ok = true for i = 0, 1 do local num = get_fault_num(ngx.time() - i * 60) if num > 1000 then ok = false break end end if not ok then local query = "degradation=on" if ngx.var.args then ngxngx.var.args = ngx.var.args .. "&" .. query else ngx.var.args = query end end '; try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { set $cache_key $request_method://$host$request_uri; set $cache_bypass "1"; if ($arg_degradation = "on") { set $cache_bypass "0"; } try_files $uri =404; include fastcgi.conf; fastcgi_pass php; fastcgi_intercept_errors on; fastcgi_next_upstream error timeout; fastcgi_cache degradation; fastcgi_cache_lock on; fastcgi_cache_lock_timeout 1s; fastcgi_cache_valid 200 301 302 10h; fastcgi_cache_min_uses 10; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_key $cache_key; fastcgi_cache_bypass $cache_bypass; add_header X-Cache-Status $upstream_cache_status; add_header X-Response-Time $upstream_response_time; } location @degradation { content_by_lua ' if ngx.var.arg_degradation then return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end local res = ngx.location.capture( ngx.var.request_uri, {args = "degradation=on"} ) ngx.status = res.status for name, value in pairs(res.header) do ngx.header[name] = value end ngx.print(res.body) incr_fault_num() '; } }
說明:實際上真實案例中緩存鍵名的獲取邏輯有點復雜,鑒于篇幅所限一切從簡。
當系統正常時,運行于動態模式,數據通過PHP-FPM渲染;當系統異常時,全局緩存被激活,運行于靜態模式,數據通過緩存渲染。通過測試發現,系統在從正常切換到異常時,因為舍棄了PHP-FPM,所以RPS從一千躍升到一萬。這讓我想起兒時看圣斗士的情景:每當不死鳥一輝被敵人擊倒后,他總能重新站起來,并爆發出更大的能量。
此外需要說明的是:在發生故障的時候,如果出現大量緩存過期的情況,那么由于涉及到緩存的重建,所以依然會和PHP-FPM發生交互行為,這可能會影響性能,此時沒有特別好的解決辦法,如果Nginx版本夠的話,可以考慮激活fastcgi_cache_revalidate,如此一來,PHP-FPM一旦判斷系統處于異常情況,那么可以直接返回304實現緩存續期。
以上就是FastCGI 中怎么利用Cache實現服務降級,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。