web站點經過Nginx作反向代理,兩個tomcat作負載均衡。前端
web站點有一個羣發短信模塊,管理員能夠填寫發送內容,手機號列表。點擊發送,後臺會執行羣發短信操做,在發送結束後,返回發送結果。nginx
在很早以前遇到過,重複發送的問題。最開始覺得管理員異常操做,重複點擊了發送按鈕。所以對前端提交作了限制。在點擊發送時,把按鈕置爲disable,執行完畢拿到返回數據,再置爲可用,從前端限制重複提交。web
今天忽然有同事又使用到了這個模塊,分別羣發了兩批短信(8000條和1600條),前端都提示了操做失敗,但本身的手機卻分別收到了重複的短信推送。瀏覽器
首先確認了手機號列表沒有重複,也經過瀏覽器調試確認前端沒有發起重複請求。tomcat
經過查看兩臺服務器的日誌,確實出現了重複的發送,且發送時間點不在同一時刻。服務器
經過日誌,能夠估算出,發送一條短信的時間在10毫秒。 負載均衡
也經過日誌,查看到了處理超時日誌,且發現了規律,重複的請求在不一樣機器處理且處理間隔時間相差一致運維
A日誌post
10:03:05,878 INFO TIMEOUT.info:252 - time: 75701ms, concurrent: 1, url: /push/sendmessage. 10:07:24,705 INFO TIMEOUT.info:252 - time: 15148ms, concurrent: 0, url: /push/sendmessage.
B日誌優化
10:03:21,599 INFO TIMEOUT.info:252 - time: 76471ms, concurrent: 1, url: /push/sendmessage. 10:07:39,718 INFO TIMEOUT.info:252 - time: 15113ms, concurrent: 0, url: /push/sendmessage.
結合以上信息猜想,應該是請求執行時間超過限制,形成前端提示失敗。重複的提交應該是重試機制形成。
因而聯繫運維進行確認。獲得相關答覆:
Nginx能夠配置超時時間,假設配置15s,而一個請求須要16s才能處理完返回。Nginx路由到A服務器處理,A執行到第15s時,沒有正常返回,Nginx會從新發到B服務處理,B執行到第15s時,也沒有正常返回。前端等待30s,最後返回失敗。A和B分別收到對應的請求,內部都進行了處理。
和運維同窗確認過緣由後,就能夠根據相關信息本身搜索。
文中也點到了一種解決方案,能夠經過ip訪問服務,繞過nginx。
另外咱們的web站點,有一個下載的功能,在優化以前,每次下載的執行時間也很長,可是確沒有遇到超時問題。分析了多是GET和POST的區別。上文也給出了下面這個連接,肯定大體思路。
經過網上的信息參考,Nginx能夠對文件上傳,下載,GET和POST請求設置不一樣的超時策略。
另外對於短信羣發業務,其實有單獨的模塊,經過規則管理配置,作離線任務執行。現有保留的羣發模塊,只是爲了應對小規模的業務。