posted @ 2018-11-06 11:03 Jack Jiang 閱讀(164) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-11-05 13:57 Jack Jiang 閱讀(1288) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-29 12:34 Jack Jiang 閱讀(175) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-26 10:42 Jack Jiang 閱讀(452) | 評(píng)論 (0) | 編輯 收藏
本文原作者“虞大膽的嘰嘰喳喳”,原文鏈接:jianshu.com/p/8861da5734ba,感謝原作者。
1、引言
很多人一提到 HTTPS,第一反應(yīng)就是安全,對(duì)于普通用戶來(lái)說(shuō)這就足夠了;
但對(duì)于程序員,很有必要了解下 HTTP 到底有什么問(wèn)題?以及HTTPS 是如何解決這些問(wèn)題的?其背后的解決思路和方法是什么?
本文只做簡(jiǎn)單的描述,力求簡(jiǎn)單明了的闡明主要內(nèi)容,因?yàn)镠TTPS 體系非常復(fù)雜,這么短的文字是無(wú)法做到很詳細(xì)和精準(zhǔn)的分析。想要詳細(xì)了解HTTPS的方方面面,可以閱讀此前即時(shí)通訊網(wǎng)整理的《即時(shí)通訊安全篇(七):如果這樣來(lái)理解HTTPS,一篇就夠了》一文。
(本文同步發(fā)布于:http://www.52im.net/thread-2027-1-1.html)
2、HTTPS相關(guān)文章
《即時(shí)通訊安全篇(七):如果這樣來(lái)理解HTTPS,一篇就夠了》
《一文讀懂Https的安全性原理、數(shù)字證書(shū)、單項(xiàng)認(rèn)證、雙項(xiàng)認(rèn)證等》
《HTTPS時(shí)代已來(lái),打算更新你的HTTP服務(wù)了嗎?》
《蘋(píng)果即將強(qiáng)制實(shí)施 ATS,你的APP準(zhǔn)備好切換到HTTPS了嗎?》
3、對(duì)HTTPS性能的理解
HTTP 有典型的幾個(gè)問(wèn)題,第一就是性能,HTTP 是基于 TCP 的,所以網(wǎng)絡(luò)層就不說(shuō)了(快慢不是 HTTP 的問(wèn)題)。
比較嚴(yán)重的問(wèn)題在于 HTTP 頭是不能壓縮的,每次要傳遞很大的數(shù)據(jù)包。另外 HTTP 的請(qǐng)求模型是每個(gè)連接只能支持一個(gè)請(qǐng)求,所以會(huì)顯得很慢。
那么 HTTPS 是解決這些問(wèn)題的嗎?
不是,實(shí)際上 HTTPS 是在 HTTP 協(xié)議上又加了一層,會(huì)更慢,相信未來(lái)會(huì)逐步解決的。同時(shí) HTTPS 用到了很多加密算法,這些算法的執(zhí)行也是會(huì)影響速度的。
為什么說(shuō) HTTPS 提升了性能呢?因?yàn)橹挥兄С至?HTTPS,才能部署 HTTP/2,而 HTTP/2 協(xié)議會(huì)提升速度,能夠有效減輕客戶端和服務(wù)器端的壓力,讓響應(yīng)更快速。有關(guān)HTTP/2詳細(xì)文章可以看看《從HTTP/0.9到HTTP/2:一文讀懂HTTP協(xié)議的歷史演變和設(shè)計(jì)思路》、《腦殘式網(wǎng)絡(luò)編程入門(mén)(四):快速理解HTTP/2的服務(wù)器推送(Server Push)》,這里只要知道一點(diǎn):HTTP/2 能夠加快速度的主要原因在于多路復(fù)用,同一個(gè)連接能夠并行發(fā)送和接收多個(gè)請(qǐng)求。
4、傳統(tǒng)HTTP的安全性問(wèn)題
當(dāng)用戶在瀏覽器輸入一個(gè)網(wǎng)址的時(shí)候,在地址欄上看到小鎖圖標(biāo),就會(huì)安心,潛意識(shí)的認(rèn)為自己的上網(wǎng)行為是安全的,當(dāng)然對(duì)于小白用戶來(lái)說(shuō)可能還不明白,但是未來(lái)會(huì)慢慢改善的(萬(wàn)事開(kāi)頭難嘛)。
那么 HTTP 到底有什么安全問(wèn)題呢,看幾個(gè)例子:
1)由于互聯(lián)網(wǎng)傳輸是能夠被攔截的,所以假如你的上網(wǎng)方式被別人控制了(沒(méi)有絕對(duì)的安全),那么你的任何行為和信息攻擊者都會(huì)知道,比如我們連上一個(gè)匿名的 WIFI,當(dāng)你上網(wǎng)的時(shí)候,輸入的網(wǎng)站密碼可能就已經(jīng)泄漏了;
2)當(dāng)我們?cè)谏弦粋€(gè)網(wǎng)站的時(shí)候,莫名其妙跳出一個(gè)廣告(這個(gè)廣告并不是這個(gè)網(wǎng)站的),那是因?yàn)樵L問(wèn)的頁(yè)面可能被運(yùn)營(yíng)商強(qiáng)制修改了(加入了他自己的內(nèi)容,比如廣告)。
HTTP 最大的問(wèn)題就在于數(shù)據(jù)沒(méi)有加密,以及通信雙方?jīng)]有辦法進(jìn)行身份驗(yàn)證( confidentiality and authentication),由于數(shù)據(jù)沒(méi)有加密,那么只要數(shù)據(jù)包被攻擊者劫持,信息就泄漏了。
身份驗(yàn)證的意思就是服務(wù)器并不知道連接它的客戶端到底是誰(shuí),而客戶端也不確定他連接的服務(wù)器就是他想連接的服務(wù)器,雙方之間沒(méi)有辦法進(jìn)行身份確認(rèn)。
有關(guān)HTTP比較好的文章,可以看看:
《網(wǎng)絡(luò)編程懶人入門(mén)(七):深入淺出,全面理解HTTP協(xié)議》
《從HTTP/0.9到HTTP/2:一文讀懂HTTP協(xié)議的歷史演變和設(shè)計(jì)思路》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(三):HTTP協(xié)議必知必會(huì)的一些知識(shí)》
5、HTTPS 背后的密碼學(xué)
為了解決 HTTP 的兩個(gè)核心問(wèn)題,HTTPS 出現(xiàn)了,HTTPS 包含了核心的幾個(gè)部分:TLS 協(xié)議、OpenSSL,證書(shū)。
什么是 OpenSSL 呢,它實(shí)現(xiàn)了世界上非常重要和多的密碼算法,而密碼學(xué)是解決問(wèn)題最重要的一個(gè)環(huán)節(jié)。
TLS 最重要的是握手的處理方式。證書(shū)的體系也很大,但是他們背后都是基于同樣的密碼學(xué)。
1)既然 HTTP 沒(méi)有數(shù)據(jù)加密,那么我們就加密下,對(duì)稱(chēng)加密算法上場(chǎng)了,這種算法加密和解密要使用同一個(gè)密鑰,通信雙方需要知道這個(gè)密鑰(或者每次協(xié)商一個(gè)),實(shí)際上這種方法不太可能,這涉及到密鑰保密和配送的問(wèn)題,一旦被攻擊者知道了密鑰,那么傳輸?shù)臄?shù)據(jù)等同沒(méi)有加密。
2)這個(gè)時(shí)候非對(duì)稱(chēng)加密算法上場(chǎng)了,公鑰和私鑰是分開(kāi)的,客戶端保存公鑰,服務(wù)器保存私鑰(不會(huì)公開(kāi)),這時(shí)候好像能夠完美解決問(wèn)題了。
但實(shí)際上會(huì)存在兩個(gè)問(wèn)題,第一就是非對(duì)稱(chēng)加密算法運(yùn)算很慢,第二就是會(huì)遇到中間人攻擊問(wèn)題。
先說(shuō)說(shuō)中間人攻擊的問(wèn)題,假如使用非對(duì)稱(chēng)加密算法,對(duì)于客戶端來(lái)說(shuō)它拿到的公鑰可能并不是真正服務(wù)器的公鑰,因?yàn)榭蛻舳松暇W(wǎng)的時(shí)候可能不會(huì)仔細(xì)分辨某個(gè)公鑰是和某個(gè)公司綁定的,假如錯(cuò)誤的拿到攻擊者的公鑰,那么他發(fā)送出去的數(shù)據(jù)包被劫持后,攻擊者用自己的私鑰就能反解了。
3)接下來(lái)如何解決公鑰認(rèn)證的問(wèn)題呢?證書(shū)出現(xiàn)了,證書(shū)是由 CA 機(jī)構(gòu)認(rèn)證的,客戶端都充分信任它,它能夠證明你拿到的公鑰是特定機(jī)構(gòu)的,然后就能使用非對(duì)稱(chēng)加密算法加密了。
證書(shū)是怎么加密的呢?實(shí)際上也是通過(guò)非對(duì)稱(chēng)加密算法,但是區(qū)別在于證書(shū)是用私鑰加密,公鑰解密。
CA 機(jī)構(gòu)會(huì)用自己的私鑰加密服務(wù)器用戶的公鑰,而客戶端則用 CA 機(jī)構(gòu)的公鑰解出服務(wù)器的公鑰。聽(tīng)上去有點(diǎn)暈,仔細(xì)體會(huì)下。這方面的知識(shí),可以詳細(xì)閱讀:《即時(shí)通訊安全篇(七):如果這樣來(lái)理解HTTPS,一篇就夠了》。
4)上面說(shuō)了非對(duì)稱(chēng)加密算法加密解密非常耗時(shí),對(duì)于 HTTP 這樣的大數(shù)據(jù)包,速度就更慢了,這時(shí)候可以使用對(duì)稱(chēng)加密算法,這個(gè)密鑰是由客戶端和服務(wù)器端協(xié)商出來(lái),并由服務(wù)器的公鑰進(jìn)行加密傳遞,所以不存在安全問(wèn)題。
5)另外客戶端拿到證書(shū)后會(huì)驗(yàn)證證書(shū)是否正確,它驗(yàn)證的手段就是通過(guò) Hash 摘要算法,CA 機(jī)構(gòu)會(huì)將證書(shū)信息通過(guò) Hash 算法運(yùn)算后再用私鑰加密,客戶端用 CA 的公鑰解出后,再計(jì)算證書(shū)的 Hash 摘要值,兩者一致就說(shuō)明驗(yàn)證身份通過(guò)。
6)HTTPS 解決的第三個(gè)問(wèn)題是完整性問(wèn)題,就是信息有沒(méi)有被篡改(信息能夠被反解),用的是 HMAC 算法,這個(gè)算法和 Hash 方法差不多,但是需要傳遞一個(gè)密鑰,這個(gè)密鑰就是客戶端和服務(wù)器端上面協(xié)商出來(lái)的。
附錄:更多安全方面的文章
《即時(shí)通訊安全篇(一):正確地理解和使用Android端加密算法》
《即時(shí)通訊安全篇(二):探討組合加密算法在IM中的應(yīng)用》
《即時(shí)通訊安全篇(三):常用加解密算法與通訊安全講解》
《即時(shí)通訊安全篇(四):實(shí)例分析Android中密鑰硬編碼的風(fēng)險(xiǎn)》
《即時(shí)通訊安全篇(五):對(duì)稱(chēng)加密技術(shù)在Android平臺(tái)上的應(yīng)用實(shí)踐》
《即時(shí)通訊安全篇(六):非對(duì)稱(chēng)加密技術(shù)的原理與應(yīng)用實(shí)踐》
《傳輸層安全協(xié)議SSL/TLS的Java平臺(tái)實(shí)現(xiàn)簡(jiǎn)介和Demo演示》
《理論聯(lián)系實(shí)際:一套典型的IM通信協(xié)議設(shè)計(jì)詳解(含安全層設(shè)計(jì))》
《微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解》
《來(lái)自阿里OpenIM:打造安全可靠即時(shí)通訊服務(wù)的技術(shù)實(shí)踐分享》
《簡(jiǎn)述實(shí)時(shí)音視頻聊天中端到端加密(E2EE)的工作原理》
《移動(dòng)端安全通信的利器——端到端加密(E2EE)技術(shù)詳解》
《Web端即時(shí)通訊安全:跨站點(diǎn)WebSocket劫持漏洞詳解(含示例代碼)》
《IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(四):正確理解HTTP短連接中的Cookie、Session和Token》
(本文同步發(fā)布于:http://www.52im.net/thread-2027-1-1.html)
posted @ 2018-10-24 14:05 Jack Jiang 閱讀(232) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-22 12:43 Jack Jiang 閱讀(213) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-17 14:31 Jack Jiang 閱讀(527) | 評(píng)論 (0) | 編輯 收藏
本文引用了阿豪的微信公眾號(hào)文章分享,感謝原作者的分享。
1、前言
隨著社會(huì)的發(fā)展、互聯(lián)網(wǎng)技術(shù)的進(jìn)步,以前的大型機(jī)服務(wù)端架構(gòu)很顯然由于高成本、難維護(hù)等原因漸漸地變得不再那么主流了,替代它的就是當(dāng)下最火的互聯(lián)網(wǎng)分布式架構(gòu)。
從若干年前大行其道的傳統(tǒng)大型機(jī)到如今的分布式架構(gòu),技術(shù)發(fā)展已經(jīng)經(jīng)歷了好幾個(gè)階段,我們只有弄明白典型互聯(lián)網(wǎng)架構(gòu)在各個(gè)階段的演進(jìn),才能更好地理解和體會(huì)分布式架構(gòu)的好處,從而有助于我們序設(shè)計(jì)適合于自已公司、產(chǎn)品或項(xiàng)目的架構(gòu)(也包括設(shè)計(jì)即時(shí)通訊網(wǎng)專(zhuān)注的IM和消息推送這類(lèi)系統(tǒng),因?yàn)榧夹g(shù)思路的原理都是一脈相承的)。那么本文我們就來(lái)聊聊分布式架構(gòu)的演進(jìn)過(guò)程,希望能給大家?guī)?lái)眼前一亮的感覺(jué)。
點(diǎn)評(píng):即時(shí)通訊網(wǎng)作為IM和推送技術(shù)研究、學(xué)習(xí)和分享的社區(qū),整理了大量的跟IM和推廣技術(shù)有關(guān)的基礎(chǔ)技術(shù)資料(比如網(wǎng)絡(luò)基礎(chǔ)、通信理論、架構(gòu)基礎(chǔ)等),本文內(nèi)容雖然看起來(lái)跟IM和推送技術(shù)沒(méi)有直接的關(guān)聯(lián)性,但因?yàn)樵O(shè)計(jì)IM和推送系統(tǒng)的技術(shù)思路和原理跟典型大型互聯(lián)網(wǎng)分布式架構(gòu)都是一脈相承的,因而讀懂本文內(nèi)容對(duì)于IM和推送系統(tǒng)的架構(gòu)設(shè)計(jì)同樣大有裨益。
學(xué)習(xí)交流:
- 即時(shí)通訊開(kāi)發(fā)交流3群:185926912[推薦]
- 移動(dòng)端IM開(kāi)發(fā)入門(mén)文章:《新手入門(mén)一篇就夠:從零開(kāi)發(fā)移動(dòng)端IM》
(本文同步發(fā)布于:http://www.52im.net/thread-2007-1-1.html)
2、相關(guān)文章
如果你已完全掌握本文的相關(guān)知識(shí),請(qǐng)移步繼續(xù)閱讀即時(shí)通訊網(wǎng)整理的另一篇:《騰訊資深架構(gòu)師干貨總結(jié):一文讀懂大型分布式系統(tǒng)設(shè)計(jì)的方方面面》,該文適合對(duì)互聯(lián)網(wǎng)架構(gòu)知識(shí)有一定了解的程序員閱讀和學(xué)習(xí),都是不可能多得的技術(shù)干貨。
3、技術(shù)背景說(shuō)明
我們都知道一個(gè)成熟的大型網(wǎng)站的系統(tǒng)架構(gòu)并非一開(kāi)始就設(shè)計(jì)的非常完美,也沒(méi)有一開(kāi)始就具備高性能、高并發(fā)、高可用、安全性等特性,而是隨著用戶量的增加、業(yè)務(wù)功能的擴(kuò)展逐步演變過(guò)來(lái)的,慢慢的完善的。 在這個(gè)過(guò)程中,開(kāi)發(fā)模式、技術(shù)架構(gòu)等都會(huì)隨著迭代發(fā)生非常大的變化。 而針對(duì)不同業(yè)務(wù)特征的系統(tǒng),各自都會(huì)有自己的側(cè)重點(diǎn),例如像淘寶這類(lèi)的網(wǎng)站,要解決的重點(diǎn)問(wèn)題就是海量商品搜索、下單、支付等問(wèn)題; 像騰訊這類(lèi)的網(wǎng)站,要解決的是數(shù)億級(jí)別用戶的實(shí)時(shí)消息傳輸;而像百度這類(lèi)的公司所要解決的又是海量數(shù)據(jù)的搜索。每一個(gè)種類(lèi)的業(yè)務(wù)都有自己不同的系統(tǒng)架構(gòu)。
為了方便展開(kāi)本文要講解的內(nèi)容,我們來(lái)簡(jiǎn)單模擬一個(gè)架構(gòu)演變過(guò)程: 我們以 javaweb 為例,來(lái)搭建一個(gè)簡(jiǎn)單的電商系統(tǒng),從這個(gè)系統(tǒng)中來(lái)看系統(tǒng)的演變過(guò)程。要注意的是接下來(lái)的演示模型, 關(guān)注的是數(shù)據(jù)量、訪問(wèn)量提升,網(wǎng)站結(jié)構(gòu)的變化, 而不關(guān)注具體業(yè)務(wù)的功能點(diǎn)。其次,這個(gè)過(guò)程是為了讓大家能更好的了解網(wǎng)站演進(jìn)過(guò)程中的一些問(wèn)題和應(yīng)對(duì)策略。
假如我們要設(shè)計(jì)的互聯(lián)網(wǎng)系統(tǒng)需要具備以下功能:
1)用戶模塊:用戶注冊(cè)和管理;
2)商品模塊:商品展示和管理;
3)交易模塊:創(chuàng)建交易及支付結(jié)算。
請(qǐng)帶著上述3個(gè)技術(shù)點(diǎn),繼續(xù)深入閱讀本文的正文內(nèi)容。干貨馬上開(kāi)始了。。。
4、架構(gòu)演進(jìn)階段一:?jiǎn)螒?yīng)用架構(gòu)
如上圖所示,這個(gè)階段是網(wǎng)站的初期,也可以認(rèn)為是互聯(lián)網(wǎng)發(fā)展的早期,系統(tǒng)架構(gòu)如上圖所示。我們經(jīng)常會(huì)在單臺(tái)服務(wù)器上運(yùn)行我們所有的程序和軟件。 把所有軟件和應(yīng)用都部署在一臺(tái)機(jī)器上,這樣就完成一個(gè)簡(jiǎn)單系統(tǒng)的搭建,這個(gè)階段的講究的是效率。效率決定生死。
5、架構(gòu)演進(jìn)階段二:應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器分離
隨著網(wǎng)站的上線,訪問(wèn)量逐步上升,服務(wù)器的負(fù)載慢慢提高,我們應(yīng)該在服務(wù)器還沒(méi)有超載的時(shí)候就做好規(guī)劃、提升網(wǎng)站的負(fù)載能力。假若此時(shí)已經(jīng)沒(méi)辦法在代碼層面繼續(xù)優(yōu)化提高,那么在單臺(tái)機(jī)器的性能遇到瓶頸的時(shí)候,增加機(jī)器是一個(gè)比較簡(jiǎn)單好用的方式,投入產(chǎn)出比相當(dāng)高。這個(gè)階段增加機(jī)器的主要目的是將 web 服務(wù)器和 數(shù)據(jù)庫(kù)服務(wù)器拆分開(kāi)來(lái),這樣做的話不僅提高了單機(jī)的負(fù)載能力,也提高了整個(gè)系統(tǒng)的容災(zāi)能力。
這個(gè)階段的系統(tǒng)架構(gòu)如上圖所示,應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器完全隔離開(kāi)來(lái),相互互不影響,大大減少了網(wǎng)站宕機(jī)的風(fēng)險(xiǎn),此階段我們已經(jīng)開(kāi)始關(guān)注到應(yīng)用服務(wù)器的管理了。
6、架構(gòu)演進(jìn)階段三:應(yīng)用服務(wù)器集群
這個(gè)階段,隨著訪問(wèn)量的繼續(xù)不斷增加,單臺(tái)應(yīng)用服務(wù)器已經(jīng)無(wú)法滿足我們的需求。 假設(shè)我的數(shù)據(jù)庫(kù)服務(wù)器還沒(méi)有遇到性能問(wèn)題,那我們可以通過(guò)增加應(yīng)用服務(wù)器的方式來(lái)將應(yīng)用服務(wù)器集群化,這樣就可以將用戶請(qǐng)求分流到各個(gè)服務(wù)器中,從而達(dá)到繼續(xù)提升系統(tǒng)負(fù)載能力的目的。此時(shí)各個(gè)應(yīng)用服務(wù)器之間沒(méi)有直接的交互,他們都是依賴(lài)數(shù)據(jù)庫(kù)各自對(duì)外提供服務(wù)。
系統(tǒng)架構(gòu)發(fā)展到這個(gè)階段,各種問(wèn)題也會(huì)接踵而至:
1)用戶請(qǐng)求交由誰(shuí)來(lái)轉(zhuǎn)發(fā)到具體的應(yīng)用服務(wù)器上(誰(shuí)來(lái)負(fù)責(zé)負(fù)載均衡);
2)用戶如果每次訪問(wèn)到的服務(wù)器不一樣,那么如何維護(hù)session,達(dá)到session共享的目的。
那么此時(shí),系統(tǒng)架構(gòu)又會(huì)變成如下方式:
負(fù)載均衡又可以分為軟負(fù)載和硬負(fù)載。軟負(fù)載我們可以選擇Nginx、Apache等,硬負(fù)載我們可以選擇F5等。而session共享問(wèn)題我們可以通過(guò)配置tomcat的session共享解決。
7、架構(gòu)演進(jìn)階段四:數(shù)據(jù)庫(kù)壓力變大,數(shù)據(jù)庫(kù)讀寫(xiě)分離
架構(gòu)演變到上面的階段,并不是終點(diǎn)。通過(guò)上面的設(shè)計(jì),應(yīng)用層的性能被我們拉上來(lái)了, 但數(shù)據(jù)庫(kù)的負(fù)載也在逐漸增大,那如何去提高數(shù)據(jù)庫(kù)層面的性能呢?有了前面的設(shè)計(jì)思路以后,我們自然也會(huì)想到通過(guò)增加服務(wù)器來(lái)提高性能。但假如我們單純的把數(shù)據(jù)庫(kù)一分為二,然后對(duì)于數(shù)據(jù)庫(kù)的請(qǐng)求,分別負(fù)載到兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上,那必定會(huì)造成數(shù)據(jù)庫(kù)數(shù)據(jù)不統(tǒng)一的問(wèn)題。
所以我們一般先考慮將數(shù)據(jù)庫(kù)讀寫(xiě)分離,如下圖所示。
這個(gè)架構(gòu)設(shè)計(jì)的變化會(huì)帶來(lái)如下幾個(gè)問(wèn)題:
1)主從數(shù)據(jù)庫(kù)之間的數(shù)據(jù)需要同步(可以使用 mysql 自帶的 master-slave 方式實(shí)現(xiàn)主從復(fù)制 );
2)應(yīng)用中需要根據(jù)業(yè)務(wù)進(jìn)行對(duì)應(yīng)數(shù)據(jù)源的選擇( 采用第三方數(shù)據(jù)庫(kù)中間件,例如 mycat )。
8、架構(gòu)演進(jìn)階段五:使用搜索引擎緩解讀庫(kù)的壓力
我們都知道數(shù)據(jù)庫(kù)常常對(duì)模糊查找效率不是很高,像電商類(lèi)的網(wǎng)站,搜索是非常核心的功能,即使是做了讀寫(xiě)分離,這個(gè)問(wèn)題也不能得到有效解決。那么這個(gè)時(shí)候我們就需要引入搜索引擎了,使用搜索引擎能夠大大提升我們系統(tǒng)的查詢(xún)速度,但同時(shí)也會(huì)帶來(lái)一 些附加的問(wèn)題,比如維護(hù)索引的構(gòu)建、數(shù)據(jù)同步到搜索引擎等。
9、架構(gòu)演進(jìn)階段六:引入緩存機(jī)制緩解數(shù)據(jù)庫(kù)的壓力
然后,隨著訪問(wèn)量的持續(xù)不斷增加,逐漸會(huì)出現(xiàn)許多用戶訪問(wèn)同一內(nèi)容的情況,那么對(duì)于這些熱點(diǎn)數(shù)據(jù),沒(méi)必要每次都從數(shù)據(jù)庫(kù)重讀取,這時(shí)我們可以使用到緩存技術(shù),比如 redis、memcache 來(lái)作為我們應(yīng)用層的緩存。
另外在某些場(chǎng)景下,如我們對(duì)用戶的某些 IP 的訪問(wèn)頻率做限制, 那這個(gè)放內(nèi)存中就又不合適,放數(shù)據(jù)庫(kù)又太麻煩了,那這個(gè)時(shí)候可以使用 Nosql 的方式比如 mongDB 來(lái)代替?zhèn)鹘y(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)。
10、架構(gòu)演進(jìn)階段七:數(shù)據(jù)庫(kù)的水平/垂直拆分
我們的網(wǎng)站演進(jìn)的變化過(guò)程,交易、商品、用戶的數(shù)據(jù)都還在同一 個(gè)數(shù)據(jù)庫(kù)中,盡管采取了增加緩存,讀寫(xiě)分離的方式,但是隨著數(shù) 據(jù)庫(kù)的壓力持續(xù)增加,數(shù)據(jù)庫(kù)的瓶頸仍然是個(gè)最大的問(wèn)題。因此我 們可以考慮對(duì)數(shù)據(jù)的垂直拆分和水平拆分。
垂直拆分:把數(shù)據(jù)庫(kù)中不同業(yè)務(wù)數(shù)據(jù)拆分到不同的數(shù)據(jù)庫(kù);
水平拆分:把同一個(gè)表中的數(shù)據(jù)拆分到兩個(gè)甚至更多的數(shù)據(jù)庫(kù)中,水平拆分的原因是某些業(yè)務(wù)數(shù)據(jù)量已經(jīng)達(dá)到了單個(gè)數(shù)據(jù)庫(kù)的瓶頸,這時(shí)可以采取將表拆分到多個(gè)數(shù)據(jù)庫(kù)中。
11、架構(gòu)演進(jìn)階段八:應(yīng)用的拆分
隨著業(yè)務(wù)的發(fā)展,業(yè)務(wù)量越來(lái)越大,應(yīng)用的壓力越來(lái)越大。工程規(guī)模也越來(lái)越龐大。這個(gè)時(shí)候就可以考慮將應(yīng)用拆分,按照領(lǐng)域模型將我們的用戶、商品、交易拆分成多個(gè)子系統(tǒng)。
這樣拆分以后,可能會(huì)有一些相同的代碼,比如用戶操作,在商品和交易都需要查詢(xún),所以會(huì)導(dǎo)致每個(gè)系統(tǒng)都會(huì)有用戶查詢(xún)?cè)L問(wèn)相關(guān)操作。這些相同的操作一定是要抽象出來(lái),否則就是一個(gè)坑。所以通過(guò)走服務(wù)化路線的方式來(lái)解決。
那么服務(wù)拆分以后,各個(gè)服務(wù)之間如何進(jìn)行遠(yuǎn)程通信呢? 通過(guò) RPC 技術(shù),比較典型的有:dubbo、webservice、hessian、http、RMI 等等。前期通過(guò)這些技術(shù)能夠很好的解決各個(gè)服務(wù)之間通信問(wèn)題,但是, 互聯(lián)網(wǎng)的發(fā)展是持續(xù)的,所以架構(gòu)的演變和優(yōu)化也還在持續(xù)。
12、本文小結(jié)
通過(guò)本文,我們通過(guò)一個(gè)電商的案例,就了解到了分布式架構(gòu)的演進(jìn)過(guò)程,一環(huán)套一環(huán),環(huán)環(huán)緊密相扣。都是通過(guò)業(yè)務(wù)量和訪問(wèn)量的提升來(lái)考慮重構(gòu)架構(gòu)設(shè)計(jì),以便能夠適應(yīng)當(dāng)前的環(huán)境。不可一蹴而就,也急不來(lái),初創(chuàng)企業(yè)必須穩(wěn)扎穩(wěn)打,一步一個(gè)腳印的走出一條專(zhuān)屬自己的路。
本文主要針對(duì)的是零基礎(chǔ)初學(xué)者,如果您想深入了解相關(guān)知識(shí),請(qǐng)繼續(xù)閱讀《騰訊資深架構(gòu)師干貨總結(jié):一文讀懂大型分布式系統(tǒng)設(shè)計(jì)的方方面面》。
附錄:更多架構(gòu)方面的技術(shù)文章
《淺談IM系統(tǒng)的架構(gòu)設(shè)計(jì)》
《簡(jiǎn)述移動(dòng)端IM開(kāi)發(fā)的那些坑:架構(gòu)設(shè)計(jì)、通信協(xié)議和客戶端》
《一套海量在線用戶的移動(dòng)端IM架構(gòu)設(shè)計(jì)實(shí)踐分享(含詳細(xì)圖文)》
《一套原創(chuàng)分布式即時(shí)通訊(IM)系統(tǒng)理論架構(gòu)方案》
《從零到卓越:京東客服即時(shí)通訊系統(tǒng)的技術(shù)架構(gòu)演進(jìn)歷程》
《蘑菇街即時(shí)通訊/IM服務(wù)器開(kāi)發(fā)之架構(gòu)選擇》
《騰訊QQ1.4億在線用戶的技術(shù)挑戰(zhàn)和架構(gòu)演進(jìn)之路PPT》
《微信后臺(tái)基于時(shí)間序的海量數(shù)據(jù)冷熱分級(jí)架構(gòu)設(shè)計(jì)實(shí)踐》
《微信技術(shù)總監(jiān)談架構(gòu):微信之道——大道至簡(jiǎn)(演講全文)》
《如何解讀《微信技術(shù)總監(jiān)談架構(gòu):微信之道——大道至簡(jiǎn)》》
《快速裂變:見(jiàn)證微信強(qiáng)大后臺(tái)架構(gòu)從0到1的演進(jìn)歷程(一)》
《17年的實(shí)踐:騰訊海量產(chǎn)品的技術(shù)方法論》
《移動(dòng)端IM中大規(guī)模群消息的推送如何保證效率、實(shí)時(shí)性?》
《現(xiàn)代IM系統(tǒng)中聊天消息的同步和存儲(chǔ)方案探討》
《IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(二):如何設(shè)計(jì)大量圖片文件的服務(wù)端存儲(chǔ)架構(gòu)?》
《IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(三):快速理解服務(wù)端數(shù)據(jù)庫(kù)讀寫(xiě)分離原理及實(shí)踐建議》
《IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(四):正確理解HTTP短連接中的Cookie、Session和Token》
《WhatsApp技術(shù)實(shí)踐分享:32人工程團(tuán)隊(duì)創(chuàng)造的技術(shù)神話》
《微信朋友圈千億訪問(wèn)量背后的技術(shù)挑戰(zhàn)和實(shí)踐總結(jié)》
《王者榮耀2億用戶量的背后:產(chǎn)品定位、技術(shù)架構(gòu)、網(wǎng)絡(luò)方案等》
《IM系統(tǒng)的MQ消息中間件選型:Kafka還是RabbitMQ?》
《騰訊資深架構(gòu)師干貨總結(jié):一文讀懂大型分布式系統(tǒng)設(shè)計(jì)的方方面面》
《以微博類(lèi)應(yīng)用場(chǎng)景為例,總結(jié)海量社交系統(tǒng)的架構(gòu)設(shè)計(jì)步驟》
《快速理解高性能HTTP服務(wù)端的負(fù)載均衡技術(shù)原理》
《子彈短信光鮮的背后:網(wǎng)易云信首席架構(gòu)師分享億級(jí)IM平臺(tái)的技術(shù)實(shí)踐》
《知乎技術(shù)分享:從單機(jī)到2000萬(wàn)QPS并發(fā)的Redis高性能緩存實(shí)踐之路》
《IM開(kāi)發(fā)基礎(chǔ)知識(shí)補(bǔ)課(五):通俗易懂,正確理解并用好MQ消息隊(duì)列》
《微信技術(shù)分享:微信的海量IM聊天消息序列號(hào)生成實(shí)踐(算法原理篇)》
《微信技術(shù)分享:微信的海量IM聊天消息序列號(hào)生成實(shí)踐(容災(zāi)方案篇)》
《新手入門(mén):零基礎(chǔ)理解大型分布式架構(gòu)的演進(jìn)歷史、技術(shù)原理、最佳實(shí)踐》
(本文同步發(fā)布于:http://www.52im.net/thread-2007-1-1.html)
posted @ 2018-10-15 10:57 Jack Jiang 閱讀(219) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-10 15:16 Jack Jiang 閱讀(188) | 評(píng)論 (0) | 編輯 收藏
posted @ 2018-10-08 11:33 Jack Jiang 閱讀(383) | 評(píng)論 (0) | 編輯 收藏