秒殺活動只是網站營銷的一個附加活動,這個活動具備時間短,併發訪問量大的特色,若是和網站原有應用部署在一塊兒,必然會對現有業務形成衝擊,稍有不慎可能致使整個網站癱瘓。css
秒殺大部分使用的都是熱數據,能夠啓用單獨的cache集羣 和 mysql 集羣 數據還須要預熱 提早用程序寫到緩存裏面mysql
靜態頁面直接緩存到瀏覽器中nginx
靜態資源放到CDN上 並申請擴大CDN帶寬web
靜態資源也能夠緩存到nginx上redis
不用動態更新的商品信息 , 配置數據能夠提早緩存到web服務內存中sql
商品庫存, 商品信息 ,用戶信息 等能夠放到redis裏面。數據庫
秒殺的流量走勢在秒殺開始的時候會瞬間達到峯值 一柱擎天,對系統的壓力很大 , 能夠在點擊秒殺的時候 加入驗證碼 答題等方式 強行平滑一波曲線。瀏覽器
能夠吧請求放入到kafka等隊列中,使用消費者控制消費速度。緩存
秒殺流量異常巨大,用數據庫扣減庫存(不管樂觀鎖、悲觀鎖) , 悲觀鎖會形成大量的事務阻塞在mysql,可能會致使整個系統不響應。樂觀鎖想須要獲取一下版本號,而後大併發的更新同一行。雖然mysql 企業版提供了線程池排隊插件(要錢的),可是依然沒法知足好幾萬QPS的要求。tomcat
比較好的方法 庫存保存在redis中,使用redis lua 腳本 + kafka落地mysql 。
爲何要用redis + lua ?
redis 速度快,lua 實現原子性。 下面代碼不具有原子性。
int 庫存 = redis.get(key); if(庫存 > 0){ redis.decr(key) }
redis 須要開啓AOF持久化 ,可是畢竟是異步複製,因此仍是須要經過kafka 落地到mysql 裏面的。
若是lua 腳本返回0 , 標識秒殺結束 , 修改內存中的標誌位。 後續請求所有做廢。
tomcat jetty 其實不太適合瞬時高併發應用, 可使用undertow 基於NIO實現 吞吐量更高。
連接數 , 線程數 能夠配置的更高
通常秒殺頁面的首頁(其實裏面內容不多,就css,js連接)須要模板引擎渲染,可使用beetl ,
而且將渲染內容緩存。
爲了不用戶直接訪問下單頁面URL,須要將改URL動態化,即便秒殺系統的開發者也沒法在秒殺開始前訪問下單頁面的URL。辦法是在下單頁面URL加入由服務器端生成的隨機數做爲參數,在秒殺開始的時候才能獲得
。
使用js控制 ,js內容true、fasle,該js連接帶隨機版本號不被緩存,這個js很小 不會對形成影響。