FastCGI中怎么利用Cache實現(xiàn)服務降級

本篇文章給大家分享的是有關FastCGI 中怎么利用Cache實現(xiàn)服務降級,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

本篇文章給大家分享的是有關FastCGI 中怎么利用Cache實現(xiàn)服務降級,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)建站專注于茶陵網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供茶陵營銷型網站建設,茶陵網站制作、茶陵網頁設計、茶陵網站官網定制、重慶小程序開發(fā)服務,打造茶陵網絡公司原創(chuàng)品牌,更為您提供茶陵網站排名全網營銷落地服務。

架構圖如下:

Degradation

實現(xiàn)的關鍵點在于通過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缺省包含的功能,我們可以看作是一個通用版,不過對照我們架構圖中的目標就會發(fā)現(xiàn):它沒有實現(xiàn)全局激活緩存的功能。如何實現(xiàn)呢?最簡單的方法就是通過單位時間內出錯次數(shù)的多少來判斷系統(tǒng)健康以否,設置相應的閾值,一旦超過限制就全局激活緩存,通過Lua我們可以實現(xiàn)一個定制版:

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()         ';     } }

說明:實際上真實案例中緩存鍵名的獲取邏輯有點復雜,鑒于篇幅所限一切從簡。

當系統(tǒng)正常時,運行于動態(tài)模式,數(shù)據(jù)通過PHP-FPM渲染;當系統(tǒng)異常時,全局緩存被激活,運行于靜態(tài)模式,數(shù)據(jù)通過緩存渲染。通過測試發(fā)現(xiàn),系統(tǒng)在從正常切換到異常時,因為舍棄了PHP-FPM,所以RPS從一千躍升到一萬。這讓我想起兒時看圣斗士的情景:每當不死鳥一輝被敵人擊倒后,他總能重新站起來,并爆發(fā)出更大的能量。

此外需要說明的是:在發(fā)生故障的時候,如果出現(xiàn)大量緩存過期的情況,那么由于涉及到緩存的重建,所以依然會和PHP-FPM發(fā)生交互行為,這可能會影響性能,此時沒有特別好的解決辦法,如果Nginx版本夠的話,可以考慮激活fastcgi_cache_revalidate,如此一來,PHP-FPM一旦判斷系統(tǒng)處于異常情況,那么可以直接返回304實現(xiàn)緩存續(xù)期。

網站名稱:FastCGI中怎么利用Cache實現(xiàn)服務降級
本文網址:http://muchs.cn/article36/ejpdpg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網站、網頁設計公司、域名注冊外貿建站、關鍵詞優(yōu)化做網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網站建設