亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于NodeJS的前后端分離的思考與實踐(六)Nginx + Node.js + Java 的軟件棧部署實踐

2019-11-20 14:05:57
字體:
來源:轉載
供稿:網友

淘寶網線上應用的傳統軟件棧結構為 Nginx + Velocity + Java,即:

在這個體系中,Nginx 將請求轉發給 Java 應用,后者處理完事務,再將數據用 Velocity 模板渲染成最終的頁面。

引入 Node.js 之后,我們勢必要面臨以下幾個問題:

技術棧的拓撲結構該如何設計,部署方式該如何選擇,才算是科學合理?項目完成后,該如何切分流量,對運維來說才算是方便快捷?遇到線上的問題,如何最快地解除險情,避免更大的損失?如何確保應用的健康情況,在負載均衡調度的層面加以管理?承系統拓撲

按照我們在前后端分離的思考與實踐(二)- 基于前后端分離的模版探索一文中的思路,Velocity 需要被 Node.js 取代,從而讓這個結構變成:

這當然是最理想的目標。然而,在傳統棧中首次引入 Node.js 這一層畢竟是個新嘗試。為了穩妥起見,我們決定只在收藏夾的寶貝收藏頁面(shoucang.taobao.com/item_collect.htm)啟用新的技術,其它頁面沿用傳統方案。即,由 Nginx 判斷請求的頁面類型,決定這個請求究竟是要轉發給 Node.js 還是 Java。于是,最后的結構成了:

部署方案

上面的結構看起來沒什么問題了,但其實新問題還等在前面。在傳統結構中,Nginx 與 Java 是部署在同一臺服務器上的,Nginx 監聽 80 端口,與監聽高位 7001 端口的 Java 通信。現在引入了 Node.js ,需要新跑一個監聽端口的進程,到底是將 Node.js 與 Nginx + Java 部署在同一臺機器,還是將 Node.js 部署在單獨的集群呢?
我們來比較一下兩種方式各自特點:

淘寶網收藏夾是一個擁有千萬級日均 PV 的應用,對穩定性的要求性極高(事實上任何產品的線上不穩定都是不能接受的)。如果采用同集群部署方案,只需要一次文件分發,兩次應用重啟即可完成發布,萬一需要回滾,也只需要操作一次基線包。性能上來說,同集群部署也有一些理論優勢(雖然內網的交換機帶寬與延時都是非常樂觀的)。至于一對多或者多對一的關系,理論上可能做到服務器更加充分的利用,但相比穩定性上的要求,這一點并不那么急迫需要去解決。所以在收藏夾的改造中,我們選擇了同集群部署方案。

灰度方式

為了保證最大程度的穩定,這次改造并沒有直接將 Velocity 代碼完全去掉。應用集群中有將近 100 臺服務器,我們以服務器為粒度,逐漸引入流量。也就是說,雖然所有的服務器上都跑著 Java + Node.js 的進程,但 Nginx 上有沒有相應的轉發規則,決定了獲取這臺服務器上請求寶貝收藏的請求是否會經過 Node.js 來處理。其中 Nginx 的配置為:

location = "/item_collect.htm" {  proxy_pass http://127.0.0.1:6001; # Node.js 進程監聽的端口}

只有添加了這條 Nginx 規則的服務器,才會讓 Node.js 來處理相應請求。通過 Nginx 配置,可以非常方便快捷地進行灰度流量的增加與減少,成本很低。如果遇到問題,可以直接將 Nginx 配置進行回滾,瞬間回到傳統技術棧結構,解除險情。

第一次發布時,我們只有兩臺服務器上啟用了這條規則,也就是說大致有不到 2% 的線上流量是走 Node.js 處理的,其余的流量的請求仍然由 Velocity 渲染。以后視情況逐步增加流量,最后在第三周,全部服務器都啟用了。至此,生產環境 100% 流量的商品收藏頁面都是經 Node.js 渲染出來的(可以查看源代碼搜索 Node.js 關鍵字)。

灰度過程并不是一帆風順的。在全量切流量之前,遇到了一些或大或小的問題。大部分與具體業務有關,值得借鑒的是一個技術細節相關的陷阱。

健康檢查

在傳統的架構中,負載均衡調度系統每隔一秒鐘會對每臺服務器 80 端口的特定 URL 發起一次 get 請求,根據返回的 HTTP Status Code 是否為 200 來判斷該服務器是否正常工作。如果請求 1s 后超時或者 HTTP Status Code 不為 200,則不將任何流量引入該服務器,避免線上問題。

這個請求的路徑是 Nginx -> Java -> Nginx,這意味著,只要返回了 200,那這臺服務器的 Nginx 與 Java 都處于健康狀態。引入 Node.js 后,這個路徑變成了 Nginx -> Node.js -> Java -> Node.js -> Nginx。相應的代碼為:

  var http = require('http');  app.get('/status.taobao', function(req, res) {    http.get({      host: '127.1',      port: 7001,      path: '/status.taobao'    }, function(res) {      res.send(res.statusCode);    }).on('error', function(err) {      logger.error(err);      res.send(404);    });  });

但是在測試過程中,發現 Node.js 在轉發這類請求的時候,每六七次就有一次會耗時幾秒甚至十幾秒才能得到 Java 端的返回。這樣會導致負載均衡調度系統認為該服務器發生異常,隨即切斷流量,但實際上這臺服務器是能夠正常工作的。這顯然是一個不小的問題。

排查一番發現,默認情況下, Node.js 會使用 HTTP Agent 這個類來創建 HTTP 連接,這個類實現了 socket 連接池,每個主機+端口對的連接數默認上限是 5。同時 HTTP Agent 類發起的請求中默認帶上了 Connection: Keep-Alive,導致已返回的連接沒有及時釋放,后面發起的請求只能排隊。

最后的解決辦法有三種:

禁用 HTTP Agent,即在在調用 get 方法時額外添加參數 agent: false,最后的代碼為:

  var http = require('http');  app.get('/status.taobao', function(req, res) {    http.get({      host: '127.1',      port: 7001,      agent: false,      path: '/status.taobao'    }, function(res) {      res.send(res.statusCode);    }).on('error', function(err) {      logger.error(err);      res.send(404);    });  });

設置 http 對象的全局 socket 數量上限:

 http.globalAgent.maxSockets = 1000;

在請求返回的時候及時主動斷開連接:

http.get(options, function(res) {  }).on("socket", function (socket) {  socket.emit("agentRemove"); // 監聽 socket 事件,在回調中派發 agentRemove 事件});

實踐上我們選擇第一種方法。這么調整之后,健康檢查就沒有再發現其它問題了。

Node.js 與傳統業務場景結合的實踐才剛剛起步,仍然有大量值得深入挖掘的優化點。比比如,讓 Java 應用徹底中心化后,是否可以考分集群部署,以提高服務器利用率?;蛘?,發布與回滾的方式是否能更加靈活可控。等等細節,都值得再進一步研究。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级黑人aaaaaaa做受| 国产精品视频久久| 日韩视频免费观看| 国产综合色香蕉精品| 亚洲bt欧美bt日本bt| 热门国产精品亚洲第一区在线| 伊人久久免费视频| 国产精品亚洲视频在线观看| 亚洲国产97在线精品一区| 成人av色在线观看| 国内精品视频在线| 国产精品吴梦梦| 亚洲精品国产综合区久久久久久久| 国产日韩精品综合网站| 国产精品成久久久久三级| 日韩欧美亚洲国产一区| 国产精品久久在线观看| 97久久超碰福利国产精品…| 亚洲自拍偷拍视频| 亚洲欧美制服综合另类| 欧美日本国产在线| 国产中文字幕91| 国产精品大片wwwwww| 久久免费国产精品1| 国产日韩欧美黄色| 欧美黑人国产人伦爽爽爽| 亚洲成人网在线观看| 欧美日韩午夜视频在线观看| 国产成人精品视频在线| 欧美激情免费在线| 热门国产精品亚洲第一区在线| 操91在线视频| 欧美日韩成人黄色| 国产成人鲁鲁免费视频a| 一区二区三区国产在线观看| 欧美性猛交xxxx久久久| 国产精品视频久| 日韩在线视频网| 九九久久国产精品| 久久久国产一区二区三区| 欧美成人精品在线视频| 亚洲美女av在线| 国产91九色视频| 国产欧美精品在线播放| 91伊人影院在线播放| 97视频网站入口| 亚洲视频在线看| 最近2019中文免费高清视频观看www99| 欧美电影《睫毛膏》| xvideos成人免费中文版| 91性高湖久久久久久久久_久久99| 欧美激情伊人电影| 欧美xxxx做受欧美.88| 亚洲国产高潮在线观看| 搡老女人一区二区三区视频tv| 国产精品久久久久秋霞鲁丝| 98午夜经典影视| 亚洲激情视频网| 午夜精品三级视频福利| 91中文字幕在线| 成人免费福利在线| 一区二区三区动漫| 久久久久久久999精品视频| 97精品国产97久久久久久免费| 欧美激情一区二区三区成人| 色偷偷噜噜噜亚洲男人| 原创国产精品91| 欧美精品做受xxx性少妇| 国产这里只有精品| 亚洲美女精品成人在线视频| 欧美超级免费视 在线| 久久精品青青大伊人av| 亚洲国产欧美一区二区三区久久| 欧美色视频日本版| 日韩中文字幕亚洲| 国产精品久久久一区| 欧美黄色成人网| 不卡av日日日| 亚洲人成自拍网站| 成人疯狂猛交xxx| 久久久久久国产精品三级玉女聊斋| 国产欧亚日韩视频| 97久久伊人激情网| 欧美日韩国产一中文字不卡| 18一19gay欧美视频网站| 欧美激情a在线| 亚洲激情国产精品| 精品福利免费观看| 精品日韩中文字幕| 国产97免费视| 欧美视频中文在线看| 亚洲黄色www网站| 91成人免费观看网站| 国产精品一区久久| 中文字幕在线观看亚洲| 亚洲国产高清自拍| 欧美日韩爱爱视频| 成人网址在线观看| 国产精品久久久久影院日本| 青草成人免费视频| 国产精品热视频| 国产精品偷伦免费视频观看的| 亚洲人成网站999久久久综合| 亚洲一区亚洲二区亚洲三区| 中日韩午夜理伦电影免费| 国产专区精品视频| 欧美亚洲另类视频| 国产va免费精品高清在线观看| 中文字幕亚洲色图| 超薄丝袜一区二区| 欧美成人激情视频免费观看| 欧美在线播放视频| 欧美xxxx18国产| 精品一区二区三区三区| 亚洲国产精品福利| 隔壁老王国产在线精品| 欧美一级bbbbb性bbbb喷潮片| 久久激情视频免费观看| 国产精品美女无圣光视频| 国产91网红主播在线观看| 国产精品久久久久久久久久ktv| 精品小视频在线| 午夜精品久久久久久久99热| 精品女同一区二区三区在线播放| 色老头一区二区三区在线观看| 成人激情在线播放| 欧美大胆在线视频| 欧美精品video| 国产欧美一区二区三区在线| 欧美性生交xxxxx久久久| 久久国产精品影视| 狠狠躁夜夜躁人人躁婷婷91| 国产香蕉一区二区三区在线视频| 91精品国产自产在线| 九九精品视频在线| 黄色91在线观看| 欧美日韩成人黄色| 欧美日韩亚洲网| 久久艹在线视频| 亚洲一区二区中文字幕| www.欧美免费| 成人性生交大片免费看视频直播| 色无极亚洲影院| 97久久超碰福利国产精品…| 亚洲免费福利视频| 亚洲国产精品久久久久久| 精品毛片三在线观看| 欧美激情第三页| 福利视频导航一区| 日韩最新中文字幕电影免费看| 日韩中文字幕在线精品| xx视频.9999.com| 中文字幕在线看视频国产欧美在线看完整| 亚洲一区二区三区乱码aⅴ| 亚洲人成电影在线观看天堂色| 久热爱精品视频线路一| 国产成人一区二区三区电影| 日韩麻豆第一页| 日韩免费观看网站| 亚洲男人天天操| 久久精品国产亚洲7777| 中文字幕日韩av综合精品| 久热精品在线视频| 久久精品久久精品亚洲人|