弱網環境測試與重復提交問題總結
一、弱網環境測試
所謂弱網環境簡單來說就是網絡質量較差導致丟包和延遲等現象,具體現象就是app響應很慢。測試工具用的是強大的fillder(沒用過的自行google),fiddler是通過延遲發送或接收數據的時間來模擬限速,設置方法是:Rules → Performances → Simulate Modem Speeds,然后按Ctrl+r快捷鍵會自動打開一個CustomRules.js文件,里面有各種自定義的規則。其中有這么一段:
if (m_SimulateModem) { oSession["request-trickle-delay"] = "300"; oSession["response-trickle-delay"] = "150"; }
意思是每延遲300ms發送1kb的數據,每延遲150ms下行1kb的數據,具體值可以修改,自定義限速。定義完數據保存之后,已經勾選的SimulateModem Speeds會被取消,按照上面的步驟再次將其勾選即可。
再說下通過fillder來調試手機app運行所需要的基本設置:
設置手機代理IP和端口
找到手機的設置–>WLAN–>已連接的WiFi,長按,彈出修改網絡的選項,點擊進入,在“顯示高級選項”前打鉤,將電腦的IP和端口設置進去,端口一般選的是8080,但是可能會出現此端口被占用的情況,選擇其他端口也可以。
2.設置filler,如下圖
3.打開app點擊簽到功能,發現簽到響應緩慢,可重復點擊,這就造成了幾乎同一時間,同一個用戶有多個簽到請求發送到服務器,這幾個請求檢查是否已經簽到時發現當天記錄為空(還都沒有來得及寫進到數據庫),這樣在高并發的情況下就會有多條記錄同時寫入簽到記錄表。
二、并發重復提交解決方案
弱網環境所引發的這個并發重復提交問題,在服務器端有一個比較簡單的解決方案:利用mysql***索引機制的驗證,當有重復數據寫入時就會被拒絕,保證數據的***性。
另外一種方案是利用redis計數器特性,由于redis是單線程原子性操作,不存在多線程并發的問題,將userId和年月日作為key,每次簽到請求進來加1,如果得到的值等于1,說明這是當天***次簽到,寫入數據庫,如果大于1,則直接返回“已簽到”信息提醒用戶即可。