長連接短連接長短連接爭長短

来源:http://www.cnblogs.com/syjkfind/archive/2016/09/28/5918148.html
-Advertisement-
Play Games

其實還是這個老問題: 記一次文件下載丟包填坑之旅 http://www.cnblogs.com/syjkfind/p/5281677.html 即使現在只有haproxy-nginx-磁碟文件 比較少的轉發,但文件特別大,還是偶有文件不完整的問題。 從現象上看,瀏覽器響應是200沒問題,curl命令 ...


其實還是這個老問題:

記一次文件下載丟包填坑之旅 http://www.cnblogs.com/syjkfind/p/5281677.html

即使現在只有haproxy-nginx-磁碟文件 比較少的轉發,但文件特別大,還是偶有文件不完整的問題。

從現象上看,瀏覽器響應是200沒問題,curl命令的日誌顯示是 curl: (18) transfer closed with 204800 bytes remaining to read

字面上理解就是連接已關閉。查相關資料並沒有任何有關的答案,說nginx緩衝大小的現象不一樣已排除,倒是偶有提到連接關閉。

百思不得其解,直到跟運維同事要到haproxy的配置看了好幾遍。。。一個關鍵字引起了我的註意:http-server-close

【http-server-close】

相關配置參考資料 http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html

大意就是haproxy和瀏覽器保持長連接,但haproxy跟後端伺服器採用短連接。

什麼是長連接參考資料 http://www.cnblogs.com/cswuyg/p/3653263.html

那麼究竟是長連接好還是短連接好?其實要看具體場景。長連接可以節省反覆連接的開銷,加快響應;短連接則可以加快連接的釋放,提高併發的能力。

於是改成了http-pretend-keepalive,好像發生少了很多,再後來使用gzip傳輸就很少再發生了。當然,偶爾再有發生也是網速的問題,無解了,總不能無限制地加大timeout吧。

再有就是順帶提起的haproxy該用7層http還是3層tcp,大部分資料都是講http,這裡有提到當https轉發時得用tcp模式。http://serverfault.com/questions/611272/haproxy-http-vs-tcp

【斷點續傳】

改成http-pretend-keepalive後,有趣的事情發生了,瀏覽器得到的響應居然是206,也就是說,長連接的情況下,可以支持斷點續傳~~~

【開啟gzip傳輸】

nginx本來就是開啟支持gzip傳輸的,可是沒生效啊,為什麼呢?其實原因很簡單,就是響應類型不對。開啟支持gzip的格式是plain text和html,但預設類型是application/octet-stream。只要給返回的文件設置類型為text/plain就可以了。開啟gzip和設置Content-Type的配置就不多說了。

開啟gzip當然是爽到爆了,原來20MB的文本文件傳輸起來只有1.5MB!當然也有點小問題就是傳輸編碼是chunked,無法知道文件的總大小,無法知道文件是否完整。但是在節省了92%帶寬的情況下,都沒再聽用戶提起過傳輸不成功了。

順帶,驗證了一個問題,nginx設置限速,然後下載到一半把瀏覽器停掉,得到的文件是亂碼的,說明gzip是整個文件壓縮而不是每片去壓縮,殘缺的文件改為.zip後解壓出來得到的文件則是正確的文本而內容少了後面部分。

 

再反思整個過程,其實有幾分碰運氣歪打正著的感覺,如果在haproxy層和nginx層有比較好的抓包或監控,問題可以定位得更快速更精確(然而是生產環境,你懂的)。再有就是網路鏈路這種東西就是個幽靈,如何重現也是個難題。幸得,各種查閱資料以及對著日誌對著配置各種“格物致知”,終於在“大膽假設小心求證”中找到了出路。

至此,問題也算是相對圓滿地解決了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MEB(MySQL Enterprise Backup)是MySQL商業版中提供的備份工具,屬於物理備份。 同XtraBackup一樣,mysqlbackup的使用過程同樣包含如下三個步驟: 備份(--backup)=> 應用日誌(--apply-log)=> 恢復(--copy-back) 備份 ...
  • ...
  • 上一篇,我們講述了HBase的介紹及安裝,從列圖和引用的方式,列舉的HBase能做什麼及一些特點,也截圖了HBase的安裝過程。   下麵我們開始介紹HBase的數據模型相關操作,該部分內容較多,分成兩個部分。 ...
  • Hive數據操作 1.向管理表中裝載數據 1.向管理表中裝載數據 hive沒有行級別數據插入、數據更新和刪除操作。 採用“大量”的數據裝載操作,或者通過其它方式僅僅將文件寫入到正確目錄下。 LOAD DATA LOCAL INPATH '${env:HOME}/california-employee ...
  • create view sss as(select ISNULL(operate_time, CONVERT(VARCHAR(20),create_time,120)) time from s_project); 一、ISNULL()函數 (oracle中為nvl()函數) ISNULL()函數 使 ...
  • Configure Amazon RDS mysql to store Chinese Characters https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html http://docs.aws.amazon.com/AW ...
  • 本文重點介紹在Ubuntu中使用apt-get安裝LAMP(Ubuntu 16.04,Apache2.4.18,mysql5.7.12,php7.0.4)環境,所以不再介紹如何安裝Ubuntu。 安裝Apache: 查看Apache版本: 上面信息說明Apache安裝成功,通過瀏覽器訪問Apache ...
  • Intro Sometime we want to record cmd and outputs in the interactive shell sessions. However history cmd cannot do this. So we need cmd line recording ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...