林子大了什麼鳥都有,程序猿做久了什麼bug都有。
bug描述
- 出現在excel導入的時候
- 線上有問題,本地不可重現
- 數據量少的時候沒問題,excel基本超過1500行就出現問題
- 查看日誌
解決
- 看日誌,應該是失去客戶端連接。猜測應該是導入操作的http請求超時。
- 在導入方法添加日誌,發現後臺導入邏輯還在執行時候ajax已經返回超時了。猜測導入操作的ajax時長設置有問題。
- 查看代碼,導入操作$.ajax({})提交,設置timeout:0,測試,依然超時。後臺使用springboot+easypoi,猜測springboot有設置http超時時長。
- 修改springboot配置server.connection-timeout=120000爲兩分鐘,測試,依然超時,但是發現一個有趣的地方,每次都是到1分鐘時候超時,因此問題肯定不在以上兩個地方
- 全局搜60、1min等無果
- 再對比本地和線上環境,本地IDE運行,線上多個服務通過fegin相互調用,最終通過nginx代理到外網,對,nginx代理
- 修改nginx配置如下,問題解決
location /guanli { root html; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_send_timeout 1200s; # nginx接收upstream server數據超時, 默認60s, 如果連續的60s內沒有收到1個字節, 連接關閉 proxy_read_timeout 1200s; # nginx與upstream server的連接超時時間 proxy_connect_timeout 1200s; # 發送數據至客戶端超時, 默認60s, 如果連續的60s內客戶端沒有收到1個字節, 連接關閉 send_timeout 1200s; proxy_pass http://adminService; }
ps:
可能有童鞋提出導入時間太長,這個也作爲優化的一個角度,可是數據再多的時候,也可能2分鐘都不夠~~~