java 板


LINE

https://booking.health.gov.tw/Home/TakeNum 網路上看到台北市疫喵接種預約系統順利運行,也去看了一下, 試用了一下整個過程是: 1.首頁(同意後選莫德納) ->2.選院所(3個同意再Load時段Json) ->3.填資料送出(未真的送出) 發覺這系統沒上雲端,後台居然還是IIS 10,也沒有提升到HTTP/2, dig一下發現也沒有用DNS做RoundRobin, 查了一下北市75歲以上統計人口約19萬多, 表示單一IP可能要同時承受上萬人的毆打(×)點擊(○), 北市府的資訊處真的厲害的打擊手。 想說如果是一般規模不大的公司要如何解決,盤點一下設計思路, 1.不能時間一到就讓所有人一擁而上。 2.毋須登錄。 3.寫入永遠比讀取慢很多,寫入資料庫則是更慢,檔案則好些。 4.太多人選擇同一時段造成的超額處理。 我想大多數解決人多的想法,就是多架幾台(load balancer)來應付就好, 頻寬不是問題,電信商調整一下就好。 首先第一要務是解決"單一IP可能要同時承受上萬人的點擊"這件事, 當然有錢的買一台高級的負載平衡器,用硬體來解決, 規模不大的公司出不起這個錢,所以我的做法是最前線就是 一台稍微好一點的機器架上一個 Linux Virtual Server(LVS)來分散入口流量, LVS後面就接上2~3台Nginx做反向代理(裝在VM上做Load balancer用), 再來就是架上多台Web Server(也是在VM上)。 大概架構如下(我會把實體機接在同一個Hub上,減少網路傳輸時間, 同樣VM也是分散在不同的實體機): (1)×LVS(實機)→(N)×Nginx(VM)→(X×N)×Tomcat(VM) 因為上述所有的機台都是用Linux,所以自然必須重新調整內核參數, 以應付大量Request,(可以用Nginx併發優化找到一堆內核調整的文章)。 1.防止時間一到所有人一擁而上,最好的策略,就是閱讀測驗: 例如閱讀需知,點選同意與先回答一些問題,最後再跳出視窗再確認一下, 造成每人的時間差異,分散一下開局的壓力。 2.毋須登錄,讓Web程式變成Stateless,也就是request資料, 無論送到哪一台Tomcat都一樣,萬一需要用戶登錄,最簡單的方法就是導入 redisson-tomcat,把Session資料在Tomcat間共享,或都非Tomcat系直接導入 Spring-Session,但是就是要額外多架一台redis server 或是使用Hazelcast Library。(我的建議是redis) 3.最終資料總是要寫入資料庫的,不管怎麼Tune,concurrent connections 最多也只是調整到1、2干個,查詢(快且佔大多數)+寫入(慢很多), 我覺得較好的策略就是快取(讀取結果)+JMS(資料庫緩寫入), 當用戶取得資格,最好的方式就是登記資料寫入redis當快取並 拋給JMS慢慢寫入資料庫,完成再發簡訊。 4.最後要說的就是Race condition的問題,舉例多個人同時看到剩一個 名額時,最簡單的方式,就是開sequence,但缺點是每個院所都要開一個, 也有人用trigger避免超過,但人一多都容易引發DB overwhelming。 更好的方式是使用redis的atomic做取號,超過就叫人重選一次院所。 雖然推薦redis,只是因為網路上都說好,我實際上只用Hazelcast實戰過, 這裡不得說一下,Redis雖然本身雖然有Transction,但她沒有ROLLBACK, 如果要達成XA,必須引入redisson做為redis的Client。 另外還有一些改善點,Nginx支援HTTP/2與Etag, 常用的css,js,與圖片,連到首頁時就用同一個連線送出,並且就加ETag, 下次就客戶端就無須重新載入這些Resources。 北市預約系統的jquery-3.3.1.min.js首頁出來時未加ETag, 選醫療院所第2次才有ETag 然後重選醫療院所時ETag沒有發揮效用,又再一次載入。 不知道是不是IIS的問題, --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.120.253.7 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1625110647.A.4AC.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP