成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Java貓說】項目架構(gòu)的演進史(大型電商系列)

yuanxin / 3147人閱讀

摘要:我們本次也要從核心模塊演進細節(jié)到核心架構(gòu)設(shè)計思想,最后實現(xiàn)高性能高并發(fā)高可用的電商實戰(zhàn)項目。過程中安全性數(shù)據(jù)分析監(jiān)控反作弊繼續(xù)發(fā)展架構(gòu)服務(wù)化消息隊列任務(wù)調(diào)度多機房因此任何一個高大上的項目技術(shù)架構(gòu)和開發(fā)技術(shù)實現(xiàn)不是一蹴而就的。

閱讀本文約 “7分鐘”


大家都知道,一個真實的企業(yè)級項目開發(fā)過程、大型企業(yè)項目開發(fā)的編碼思維、經(jīng)驗、技巧、高質(zhì)量的線上作品都是需要耗費人力物力和成本,同樣我們的項目也需要你擠出時間慢慢消化哦!

讓我們來看看我們最熟悉的淘寶架構(gòu)

當(dāng)然,沒有哪個網(wǎng)站一個就是這么豐富的,都是一步一步進展起來的。

我們本次也要從核心模塊-演進細節(jié)到核心架構(gòu)-設(shè)計思想,最后實現(xiàn)高性能、高并發(fā)、高可用的電商實戰(zhàn)項目。

本次我們將講的有數(shù)據(jù)庫及接口、項目初始化、用戶模塊、分類模塊、商品模塊、購物車模塊、收貨地址模塊、支付模塊、訂單模塊······

由于是序章,我們先來了解一下,一個大型Java項目架構(gòu)演進解析

首先從一個小網(wǎng)站說起,一臺服務(wù)器就夠了,數(shù)據(jù)庫與應(yīng)用均部署到一個服務(wù)器上。

隨著用戶增加,數(shù)據(jù)量增大,硬盤支撐不起,這時一臺服務(wù)器已經(jīng)支持不起了。我們可以將應(yīng)用服務(wù)器和數(shù)據(jù)服務(wù)分離,給應(yīng)用服務(wù)器配置更好的CPU、內(nèi)存等,給數(shù)據(jù)服務(wù)器配置更好更快的硬盤,如下圖用了三臺服務(wù)器以提高性能。

即使文件服務(wù)器宕機,該架構(gòu)依然可以支持使用,隨著訪問的并發(fā)增高,為了降低接口訪問時間、提高服務(wù)性能,我們需要繼續(xù)優(yōu)化演進,我們會發(fā)現(xiàn)有很多數(shù)據(jù)其實并不需要每次都從數(shù)據(jù)庫中讀取,于是我們增加了緩存,主要是80%的訪問都集中在20%的數(shù)據(jù)上(28原則),只要緩存得當(dāng),系統(tǒng)的性能也將得到提升,而緩存又分為兩種Local Cache本地緩存、Remote Distributed Cache遠程單機緩存(遠程分布式緩存)下圖為分布式緩存集群(什么樣的業(yè)務(wù)使用遠程緩存、什么業(yè)務(wù)使用本地緩存)

這個時候隨著訪問的QPS不斷提高,服務(wù)器的處理能力有限,例如Tomcat,則其將成為一個瓶頸,即使購買更好的硬件,但總是存在上限且成本也不低,這時我們就需要做個服務(wù)器的集群(負載均衡調(diào)度服務(wù)器),這樣我們就可以橫向擴展我們的服務(wù)器,解決服務(wù)器處理能力的瓶頸。

這時我們還要思考幾個問題,所謂負載均衡的調(diào)度策略是什么,適合什么場景,當(dāng)我們登錄A服務(wù)器,Session信息存儲在A服務(wù)器上,假設(shè)我們的(IPHash)負載均衡將其信息分散到其他服務(wù)器,但是其不夠分散也不夠均勻,可能造成某些服務(wù)器壓力過大,某些則沒有壓力,這時機器網(wǎng)卡的帶寬就可能成為瓶頸,這時我們使用輪詢或最小連接負載的策略,可能導(dǎo)致訪問A服務(wù)器后,再訪問B服務(wù)器時讀取不到Session信息,這時我們就要解決Session管理的問題,我們使用Session Sticky(粘制會話)來處理這個問題,就比如說每次吃飯都為了保證用的是我們自己的碗筷,只要在飯店中存了我們的碗筷,則每次去這家飯店吃就好了,其處理方式:對于同一連接中的數(shù)據(jù)包,負載均衡將其進行一個NAT轉(zhuǎn)換后轉(zhuǎn)發(fā)至后端固定的服務(wù)器進行處理,如下圖所示,這種方案解決了session共享問題(缺點:服務(wù)器一旦重啟其session將全部消失、負載均衡服務(wù)器成為一個有狀態(tài)的服務(wù)器,比較難實現(xiàn)容災(zāi))

我們再看看第二個解決方案,兩個服務(wù)器通過復(fù)制都保存Browser1的session信息(缺點:應(yīng)用服務(wù)器間的帶寬問題,服務(wù)器間要不斷的同步session信息、大量用戶在線時服務(wù)器占用內(nèi)存過多、不適合做大規(guī)模集群)

再看看第三個方案,基于cookie,即每次吃飯都帶上自己的碗筷,則去哪家飯店都可以吃飯,用攜帶session信息的cookie去訪問服務(wù)器,其也解決了session共享的問題(缺點:cookie長度有限,且保存在瀏覽器上,安全性沒有保障)

接著再看看第四種解決方案,我們將session做成一個session服務(wù)器,browser1通過負載均衡請求服務(wù)器,服務(wù)器將session信息存儲到session服務(wù)器中,當(dāng)想要獲取時就反向進行。(缺點:目前session Server是單點的,如何解決單點,保證可用性)

我們可以將Session Server也做成集群,其適合用于Session數(shù)量與web服務(wù)數(shù)量大的情況下,更改架構(gòu)后,也要修改應(yīng)用存儲session的業(yè)務(wù)邏輯。 接下來我們再看看數(shù)據(jù)庫,讀寫都要經(jīng)過數(shù)據(jù)庫,當(dāng)用戶量達到一定量時,數(shù)據(jù)庫又將成為一個瓶頸,則我們將如何解決?我們可以使用數(shù)據(jù)庫的讀寫分離,主從庫,并通過統(tǒng)一的數(shù)據(jù)訪問模型進行訪問,將所有讀操作引入到Slave服務(wù)器,將寫操作引入到主庫當(dāng)中,由于數(shù)據(jù)庫讀寫分離,所以應(yīng)用程序也要有相應(yīng)的變化,使用數(shù)據(jù)訪問模塊讓應(yīng)用程序開發(fā)人員不用理會讀寫分離的存在,這樣多數(shù)據(jù)源讀寫代碼對我們的業(yè)務(wù)就沒有了侵入(代碼層的演變,如何支持多數(shù)據(jù)源、如何封裝對業(yè)務(wù)沒有侵入、如何使用現(xiàn)用的ORM框架實現(xiàn)數(shù)據(jù)讀寫分離、是否更換ORM、其優(yōu)缺點?)

當(dāng)我們訪問過大,I/O過大,我們數(shù)據(jù)的讀寫分離又將遇到這幾個問題,主從庫復(fù)制時是否延遲(分機房部署、跨機房傳輸),應(yīng)用對于數(shù)據(jù)源的路由問題,接著我們?yōu)榱颂岣叻?wù)器,增加了CND和反向代理服務(wù)器,使用CDN可以解決不同地方訪問速度問題、反向代理可以在機房中緩存用戶的資源。

這時文件服務(wù)器又出現(xiàn)了瓶頸,我們將文件服務(wù)器改為分布式文件服務(wù)器集群,我們要考慮到:如何不影響線上的業(yè)務(wù)訪問,是否需要業(yè)務(wù)部門幫忙清理數(shù)據(jù),是否需要備份服務(wù)器,是否需要重新做域名解析。

這時我們的數(shù)據(jù)庫又出現(xiàn)了新的瓶頸,我們選擇專庫專用的方式,進行數(shù)據(jù)庫的垂直拆分,可以解決寫數(shù)據(jù)、并發(fā)、量大的問題,分庫后又將帶來一些新的問題:跨業(yè)務(wù)的事務(wù)(分布式事務(wù))

當(dāng)某個數(shù)據(jù)的訪問量、數(shù)據(jù)量、日志等過大達到瓶頸時,這時我們就要進行數(shù)據(jù)庫的水平拆分,我們將User拆分成Users1和Users2,水平拆分即將同一個數(shù)據(jù)表的數(shù)據(jù)拆分到兩個數(shù)據(jù)庫當(dāng)中,這時我們就解決了單數(shù)據(jù)庫的瓶頸。

水平拆分后,SQL路由出現(xiàn)一些問題,假設(shè)我們想知道某個用戶是存在Users1還是Users2中,且由于分庫,主鍵的策略也將有所不同,同時也將面臨一個分頁的問題(后臺管理系統(tǒng)在進行展示時還要考慮分頁的問題),當(dāng)完成后,我們又發(fā)現(xiàn)應(yīng)用服務(wù)器的搜索量上升,這時我們將應(yīng)用服務(wù)器的搜索功能提取出來做成搜索引擎,同時部分場景使用NoSQL提高性能,

當(dāng)然以上架構(gòu)還存在部分問題,如負載均衡服務(wù)器是單點,因此也可以將負載均衡服務(wù)器做成集群,進行主從的熱備,同時做一個自動切換的解決方案。

過程中:安全性、數(shù)據(jù)分析、監(jiān)控、反作弊… 繼續(xù)發(fā)展:SOA架構(gòu)、服務(wù)化、消息隊列、任務(wù)調(diào)度、多機房…

因此任何一個高大上的項目技術(shù)架構(gòu)和開發(fā)技術(shù)實現(xiàn)不是一蹴而就的。


本文已轉(zhuǎn)載個人技術(shù)公眾號:UncleCatMySelf
歡迎留言討論與點贊
上一篇推薦:【Java貓說】SSM整合Netty5.0詳細說明
下一篇推薦:【Java貓說】實例變量與局部變量

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11897.html

相關(guān)文章

  • Java貓說項目架構(gòu)進史大型電商系列

    摘要:我們本次也要從核心模塊演進細節(jié)到核心架構(gòu)設(shè)計思想,最后實現(xiàn)高性能高并發(fā)高可用的電商實戰(zhàn)項目。過程中安全性數(shù)據(jù)分析監(jiān)控反作弊繼續(xù)發(fā)展架構(gòu)服務(wù)化消息隊列任務(wù)調(diào)度多機房因此任何一個高大上的項目技術(shù)架構(gòu)和開發(fā)技術(shù)實現(xiàn)不是一蹴而就的。 閱讀本文約 7分鐘 大家都知道,一個真實的企業(yè)級項目開發(fā)過程、大型企業(yè)項目開發(fā)的編碼思維、經(jīng)驗、技巧、高質(zhì)量的線上作品都是需要耗費人力物力和成本,同樣我們的項目...

    sumory 評論0 收藏0
  • Java貓說】SSM整合Netty5.0詳細說明

    摘要:而我們項目在實測時也是將項目發(fā)布到測試服務(wù)器,通過模擬工具進行測試連接,當(dāng)數(shù)據(jù)格式正常,且業(yè)務(wù)數(shù)據(jù)正常,服務(wù)器就會對指令執(zhí)行對應(yīng)的操作。 閱讀本文約5.5分鐘 最近又有粉絲加Q群討論netty整合SSM項目的方式等,我在這里抽了休息日的時候整理一下,一步一步的記錄,注意的是,本案例僅實現(xiàn)了用netty整合SSM后與單片機等類TCP應(yīng)用通信。 SSM + Netty項目結(jié)合思路 對于N...

    dingding199389 評論0 收藏0
  • Java貓說】實例變量與局部變量

    摘要:我們來看看實例變量與局部變量之間的差別實例變量是聲明在類內(nèi)而不是方法中。局部變量在使用前必須初始化。局部變量沒有默認(rèn)值,如果在變量被初始化前就要使用的話,編譯器會顯示錯誤。 閱讀本文約1.8分鐘 實例變量永遠都會有默認(rèn)值,如果你沒有明確的賦值給實例變量,或者沒有調(diào)用setter,實例變量還是會有值! integers 0 floating points 0.0 boolean...

    dreamtecher 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<