成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從技術(shù)演變的角度看互聯(lián)網(wǎng)后臺(tái)架構(gòu)

開發(fā) 開發(fā)工具
這是去年在部門內(nèi)部做的一個(gè)面向后臺(tái)開發(fā)新同學(xué)的課程,因?yàn)槠渌鸅G一些同學(xué)要求分享,所以發(fā)一下。

這是去年在部門內(nèi)部做的一個(gè)面向后臺(tái)開發(fā)新同學(xué)的課程,因?yàn)槠渌鸅G一些同學(xué)要求分享,所以發(fā)一下。

其實(shí)內(nèi)容都是些常見開源組件的high level描述,比如flask, express框架,中間件的演化,micro service的概念,一些對(duì)nosql/column based db的概念介紹,docker的一些簡(jiǎn)單概念等等。從單個(gè)概念來說,這只是一些科普。

但是為什么當(dāng)時(shí)要開這門課呢?重點(diǎn)是我發(fā)現(xiàn)很多新入職的后臺(tái)開發(fā)同學(xué)并不太清楚自己做的東西在現(xiàn)代互聯(lián)網(wǎng)整體架構(gòu)中處于一個(gè)什么樣的角色,而在IEG內(nèi)部則因?yàn)橛螒蜷_發(fā)和互聯(lián)網(wǎng)開發(fā)的一些歷史性差異,有些概念并不清晰。

拿中間件來說,很多web application不用啥中間件一樣可以跑很好,那么是不是都要上redis?到底解決什么問題?中間件又存在什么問題?中臺(tái)和中間件又是個(gè)什么關(guān)系?如果開個(gè)mq就是中間件,微服務(wù)又是要做啥?

如果能從這十多年來互聯(lián)網(wǎng)應(yīng)用的整個(gè)tech stack變化去看待backend architecture的一些改變,應(yīng)該是一件有趣也有意思的事情。這是當(dāng)時(shí)寫這個(gè)ppt開課的初衷。

我不敢說我在這個(gè)ppt里面的一些私貨概念就是對(duì)的,但是也算是個(gè)人這么多年的一些認(rèn)知理解,拋磚引玉吧。

強(qiáng)調(diào)一點(diǎn),這個(gè)ppt的初衷是希望從近十多年來不同時(shí)代不同熱點(diǎn)下技術(shù)棧的變化來看看我們是如何從最早的php/asp/jsp<=>mysql這樣的兩層架構(gòu),一個(gè)階段一個(gè)階段演變到現(xiàn)在繁復(fù)的大數(shù)據(jù)、機(jī)器學(xué)習(xí)、消息驅(qū)動(dòng)、微服務(wù)架構(gòu)這樣的體系,然后在針對(duì)其中比較重要的幾個(gè)方面來給新入門后臺(tái)開發(fā)的同學(xué)起個(gè)“提綱目錄”的作用。如果要對(duì)每個(gè)方面都深入去談,那肯定不是一兩頁P(yáng)PT就能做到的事情。

下面我們開始。首先看***頁如下圖:什么是System Design?什么是架構(gòu)設(shè)計(jì)?為什么要談架構(gòu)設(shè)計(jì)?

 

之所以拋出這個(gè)問題,是因?yàn)槠綍r(shí)常常聽到兩個(gè)互相矛盾的說法:一方面很多人愛說“架構(gòu)師都是不干活夸夸其談”,另一方面又有很多人苦惱限于日常業(yè)務(wù)需求開發(fā),無法或者沒有機(jī)會(huì)去從整體架構(gòu)思考,不知道怎么成長(zhǎng)為架構(gòu)師。

上面ppt中很有趣的是***句英文,翻譯過來恰好可以反映了論壇上經(jīng)常有人問的“如何學(xué)習(xí)架構(gòu)”的問題:很多l(xiāng)eader一來就是扔幾本書(書名)給新同學(xué),期望他們讀完書就馬上升級(jí)。。。這種一般都只會(huì)帶來失望。

何為架構(gòu)師?不寫代碼只畫PPT?

不是的,架構(gòu)師的基本職責(zé)是要在項(xiàng)目早期就能設(shè)計(jì)好基本的框架,這個(gè)框架能夠確保團(tuán)隊(duì)成員順利coding滿足近期內(nèi)業(yè)務(wù)需求的變化,又能為進(jìn)一步的發(fā)展留出空間(所謂scalability),這即是所謂技術(shù)選型。如何確保選型正確?對(duì)于簡(jiǎn)單的應(yīng)用,或者沒有新意完全是實(shí)踐過多次的相同方案,確實(shí)靠幾頁P(yáng)PT足矣。但是對(duì)于新的領(lǐng)域新的復(fù)雜需求,這個(gè)需求未必都是業(yè)務(wù)需求,也包括根據(jù)團(tuán)隊(duì)自身特點(diǎn)(人員太多、太少、某些環(huán)節(jié)成員不熟悉需要?jiǎng)冸x開)來進(jìn)行新的設(shè)計(jì),對(duì)現(xiàn)有技術(shù)重新分解組合,這時(shí)候就需要架構(gòu)師自己編碼實(shí)現(xiàn)原型并驗(yàn)證思路正確性。

要達(dá)到這樣的目標(biāo)難不難?難!但是現(xiàn)在不是2000年了,是2019年了,大量的框架(framework)、開源工具和各種best practice,其實(shí)都是在幫我們解決這件事情。而這些框架并不是憑空而來,而是在這十多年互聯(lián)網(wǎng)的演化中因?yàn)橐鉀Q各種具體業(yè)務(wù)難點(diǎn)而一點(diǎn)一點(diǎn)積累進(jìn)化而來。無論是從mysql到mongodb到cassandra到time series db,或者從memcached到redis,從lucene到solr到elasticsearch,從離線批處理到hadoop到storm到spark到flink,技術(shù)不是突然出現(xiàn)的,總是站在前人的肩膀上不斷演變的。而要能在浩如煙海的現(xiàn)代互聯(lián)網(wǎng)技術(shù)棧中選擇合適的來組裝自己的方案,則需要對(duì)技術(shù)的來源和歷史有一定的了解。否則就會(huì)出現(xiàn)一些新人張口ELK,閉口tensorflow,然后一個(gè)簡(jiǎn)單的異步消息處理就會(huì)讓他們張口結(jié)舌的現(xiàn)象。

20多年前的經(jīng)典著作DesignPatterns中講過學(xué)習(xí)設(shè)計(jì)模式的意義,放在這里非常經(jīng)典:學(xué)習(xí)設(shè)計(jì)模式并不是要你學(xué)習(xí)一種新的技術(shù)或者編程語言,而是建立一種交流的共同語言和詞匯,在方案設(shè)計(jì)時(shí)方便溝通,同時(shí)也幫助人們從更抽象的層次去分析問題本質(zhì),而不被一些實(shí)現(xiàn)的細(xì)枝末節(jié)所困擾。同時(shí),當(dāng)我們能把很多問題抽象出來之后,也能幫我們更深入更好地去了解現(xiàn)有系統(tǒng)-------這些意義,對(duì)于今天的后端系統(tǒng)設(shè)計(jì)來說,也仍然是正確的。

下圖是我們要談的幾個(gè)主要方面。

上面的幾個(gè)主題中,***個(gè)后臺(tái)架構(gòu)的演化是自己從業(yè)十多年來,體會(huì)到的互聯(lián)網(wǎng)技術(shù)架構(gòu)的整體變遷。然后分成后臺(tái)前端應(yīng)用框架、middleware和存儲(chǔ)三大塊談一下,***兩節(jié)微服務(wù)和docker則是給剛進(jìn)入后臺(tái)開發(fā)的同學(xué)做一些概念普及。其中個(gè)人覺得最有趣的,是***部分后臺(tái)架構(gòu)的演化和第三部分的中間件,因?yàn)檫@兩者是很好地反映了過去十多年互聯(lián)網(wǎng)發(fā)展期間技術(shù)棧的變化,從LAMP到MEAN Stack,從各種繁復(fù)的中間層到漸漸統(tǒng)一的消息驅(qū)動(dòng)+流處理,每個(gè)階段的業(yè)界熱點(diǎn)都相當(dāng)有代表性。

當(dāng)然,不是說web框架、數(shù)據(jù)存儲(chǔ)就不是熱點(diǎn)了,姑且不說這幾年web前端的復(fù)雜化,光后端應(yīng)用框架,node的express,python的django/flask,go在國(guó)內(nèi)的盛行,都是相當(dāng)有趣的。在數(shù)據(jù)存儲(chǔ)領(lǐng)域,列存儲(chǔ)和時(shí)序數(shù)據(jù)隨著物聯(lián)網(wǎng)的發(fā)展也是備受重視。但是篇幅所限,在這個(gè)課程中這些話題也就只能一帶而過,因?yàn)檫@些與其說是技術(shù)的演變過程,不如說是不同的技術(shù)選型和方向了,比如說Mysql適合OLTP(Online Transaction Processing),而Cassandra/Hbase等則適合OLAP(Online Analyical Processing),并不能說后者就優(yōu)于前者。

下面我們先來看后臺(tái)架構(gòu)的演化:

嚴(yán)格說這是個(gè)很大的標(biāo)題,從2000年到現(xiàn)在的故事太多了,我這里只能盡力而為從個(gè)人體驗(yàn)來分析。

首先是2008年以前,我把它稱為網(wǎng)站時(shí)代。為什么這么說?因?yàn)槟菚r(shí)候的后臺(tái)開發(fā)就是寫網(wǎng)站,而且通常是頁面代碼和后臺(tái)數(shù)據(jù)邏輯一起寫。你只要能寫JSP/PHP/ASP來讀寫Mysql或者SQL Server,基本就能保證一份不錯(cuò)的工作了。

要強(qiáng)調(diào)一下,這種簡(jiǎn)單的兩層結(jié)構(gòu)并不能說就是落后。在現(xiàn)在各個(gè)企業(yè)、公司以及小團(tuán)隊(duì)的大量web應(yīng)用包括移動(dòng)App的后端服務(wù)中,采用這種架構(gòu)的不在少數(shù),尤其是很多公司、學(xué)校、企業(yè)的內(nèi)部服務(wù),用這種架構(gòu)已經(jīng)足夠了。

注意一個(gè)時(shí)間節(jié)點(diǎn):2008。

當(dāng)然,這個(gè)節(jié)點(diǎn)是我YY的。這個(gè)節(jié)點(diǎn)可以是2007,或者2006。這個(gè)時(shí)間段發(fā)生了兩個(gè)影響到現(xiàn)在的事情:google上市,facebook開始推開

我個(gè)人相信前者上市加上它發(fā)表的那三篇大數(shù)據(jù)paper影響了后來業(yè)界的技術(shù)方向,后者的火熱則造成了社交成為業(yè)務(wù)熱點(diǎn)。偏偏社交網(wǎng)站對(duì)大數(shù)據(jù)處理有著天然的需求,技術(shù)的積累和業(yè)務(wù)的需求就這么陰差陽錯(cuò)***結(jié)合了起來,直接影響了大海那邊后面的科技發(fā)展。

同時(shí)在中國(guó),那個(gè)時(shí)候卻是網(wǎng)絡(luò)游戲MMO的黃金年代,對(duì)單機(jī)單服高并發(fā)實(shí)時(shí)交互的需求,遠(yuǎn)遠(yuǎn)壓過了對(duì)海量數(shù)據(jù)data mining的需要,在這個(gè)時(shí)間點(diǎn),中美兩邊的互聯(lián)網(wǎng)科技樹發(fā)生了比較大的分叉。這倒是并沒有優(yōu)劣之說,只是業(yè)務(wù)場(chǎng)景的重要性導(dǎo)致了技能樹的側(cè)重。直到今天,單機(jī)(包括簡(jiǎn)單的多服務(wù)器方案)高并發(fā)、高QPS仍然也是國(guó)內(nèi)業(yè)界所追求的目標(biāo),而在美國(guó)那邊,這只是一個(gè)業(yè)務(wù)指標(biāo)而已,更看重的是如何進(jìn)行水平擴(kuò)展(horizontal scaling)和分散壓力。

國(guó)內(nèi)和美國(guó)的科技樹回到一條線上,大數(shù)據(jù)的業(yè)務(wù)需求和相關(guān)技術(shù)發(fā)展緊密結(jié)合起來,可能要到2014年左右,隨著互聯(lián)網(wǎng)創(chuàng)業(yè)的盛行,O2O業(yè)務(wù)對(duì)大數(shù)據(jù)實(shí)時(shí)處理、機(jī)器學(xué)習(xí)推薦提出了真正的需求時(shí),才是國(guó)內(nèi)業(yè)界***出現(xiàn)技術(shù)驅(qū)動(dòng)業(yè)務(wù),算法驅(qū)動(dòng)產(chǎn)品的現(xiàn)象,重新和美國(guó)灣區(qū)那邊站在了一條線上,而這則是后話了。

到了2010年前后,facebook在全球已經(jīng)是現(xiàn)象級(jí)產(chǎn)品,當(dāng)時(shí)微軟直接放棄了windows live,就是為了避免在社交領(lǐng)域硬懟facebook。八卦一下當(dāng)時(shí)在美國(guó)灣區(qū)那邊聚餐的時(shí)候,如果誰說他是facebook的,那基本就是全場(chǎng)羨慕的焦點(diǎn)。

facebook的崛起也帶動(dòng)了其他大量的社交網(wǎng)站開始出現(xiàn),社交網(wǎng)站***的特點(diǎn)就是頻繁的用戶搜索、推薦,當(dāng)用戶上億的時(shí)候,這就是前面?zhèn)鹘y(tǒng)的兩層架構(gòu)無法處理的問題了。因此這就帶動(dòng)了中間件的發(fā)展。實(shí)際上在國(guó)外很少有人用中間件或者middelware這個(gè)詞,更多是探討如何把各種service集成在一起,像國(guó)內(nèi)這樣強(qiáng)行分成frontend/middleware/storage的概念是沒聽人這么談過的,后面中間件再說這問題。當(dāng)時(shí)的一個(gè)慣例是用php做所謂的膠水語言(glue language),然后通過hessian這些協(xié)議工具來把其他java服務(wù)連接到一起。與此同時(shí),為了提高訪問速度,降低后端查詢壓力,memcached/redis也開始大量使用。基于lucene的搜索(2010左右很多是自行開發(fā))或者solr也被用在用戶搜索、推薦以及type ahead這些場(chǎng)景中。

我記憶中在2012年之前消息隊(duì)列的使用還不是太頻繁,不像后來這么重要。當(dāng)時(shí)常見的應(yīng)該就是beanstalkd/rabbitmq, zeromq其實(shí)我在灣區(qū)那邊很少聽人用,倒是后來回國(guó)后看到國(guó)內(nèi)用的人還不少。Kafka在2011年已經(jīng)出現(xiàn)了,有少部分公司開始用,不過還不是主流。

2013年之后就是大數(shù)據(jù)+云的時(shí)代了,如果大家回想一下,基本上國(guó)內(nèi)也是差不多在2014年左右開始叫出了云+大數(shù)據(jù)的口號(hào)(2013年國(guó)內(nèi)還在手游狂潮中...)。不談國(guó)外,在中國(guó)那段時(shí)間就是互聯(lián)網(wǎng)創(chuàng)業(yè)的時(shí)代,從千團(tuán)大戰(zhàn)到手游爆發(fā)到15年開始的O2O,業(yè)務(wù)的發(fā)展也帶動(dòng)了技術(shù)棧的飛速進(jìn)步。左上角大致上也寫了這個(gè)時(shí)代互聯(lián)網(wǎng)業(yè)界的主要技術(shù)熱點(diǎn),實(shí)際上這也就是現(xiàn)在的熱點(diǎn)。無論國(guó)內(nèi)國(guó)外,絕大部分公司還并沒有離開云+大數(shù)據(jù)這個(gè)時(shí)代。無論是大數(shù)據(jù)的實(shí)時(shí)處理、數(shù)據(jù)挖掘、推薦系統(tǒng)、Docker化,包括A/B測(cè)試,這些都是很多企業(yè)還正在努力全面解決的問題。

但是在少數(shù)站在業(yè)界技術(shù)頂端或者沒有歷史技術(shù)包袱的新興公司,從某個(gè)角度上來說,他們已經(jīng)開始在往下一個(gè)時(shí)代前進(jìn):機(jī)器學(xué)習(xí)AI驅(qū)動(dòng)的時(shí)代

2018年開始,實(shí)際上可能是2017年中開始,AI驅(qū)動(dòng)成了各大公司口號(hào)。上圖是facebook和uber的機(jī)器學(xué)習(xí)平臺(tái)使用情況,基本上已經(jīng)全部進(jìn)入業(yè)務(wù)核心。當(dāng)然并不是說所有公司企業(yè)都要AI驅(qū)動(dòng),顯然最近發(fā)生的波音737事件就說明該用傳統(tǒng)的就該傳統(tǒng),別啥都往并不成熟的AI上堆。但另一方面,很多新興公司的業(yè)務(wù)本身就是基于大數(shù)據(jù)或者算法的,因此他們?cè)谶@個(gè)領(lǐng)域也往往走得比較激進(jìn)。由于這個(gè)AI驅(qū)動(dòng)還并沒有一個(gè)很明確的定義和概念,還處于一種早期萌芽的階段,在這里也就不多YY了。

互聯(lián)網(wǎng)后臺(tái)架構(gòu)發(fā)展的簡(jiǎn)單過程就在這里講得差不多了,然后我們快速談一下web開發(fā)框架。

首先在前面我提到,在后端架構(gòu)中其實(shí)也有所謂的frontend(前臺(tái))開發(fā)存在,一般來說這是指響應(yīng)用戶請(qǐng)求,實(shí)現(xiàn)具體業(yè)務(wù)邏輯的業(yè)務(wù)邏輯層。當(dāng)然這么定義略微粗糙了些,很多中間存儲(chǔ)、消息服務(wù)也會(huì)封裝一些業(yè)務(wù)相關(guān)邏輯。總之web開發(fā)框架往往就是為了更方便地實(shí)現(xiàn)這些業(yè)務(wù)邏輯而存在的。

前文提到在一段較長(zhǎng)時(shí)間內(nèi),國(guó)內(nèi)的技術(shù)熱點(diǎn)是單機(jī)高并發(fā)高QPS,因此很多那個(gè)時(shí)代走過來的人會(huì)本能地質(zhì)疑web框架的性能,而更偏好TCP長(zhǎng)鏈接甚至UDP協(xié)議。然而這往往是自尋煩惱,因?yàn)槌_特別的強(qiáng)實(shí)時(shí)系統(tǒng),無論是休閑手游、視頻點(diǎn)播還是信息流,都已經(jīng)是基于HTTP的了。

上圖所提到的兩個(gè)問題中,我想強(qiáng)調(diào)的是***點(diǎn):所有的業(yè)務(wù),在能滿足需求的情況下,***HTTP協(xié)議進(jìn)行數(shù)據(jù)交互。準(zhǔn)確點(diǎn)說,***JSON,使用web API。

Why? 這就是上圖***個(gè)問題所回答的:無狀態(tài)、易調(diào)試易修改、一般沒有80端口限制。

最為詬病的無非是性能,然而實(shí)際上對(duì)非實(shí)時(shí)應(yīng)用,晚個(gè)半秒一秒不應(yīng)該是大問題,要考慮的是水平擴(kuò)展scalability,不是實(shí)時(shí)響應(yīng)(因?yàn)榍疤峋褪欠菍?shí)時(shí)應(yīng)用);其次實(shí)在不行你還有websocket可以用。

這一部分是簡(jiǎn)單列舉了一下不同框架的使用,可以看出不同框架的概念其實(shí)差不多。重點(diǎn)是要注意到middleware這個(gè)說法在web framework和后端架構(gòu)中的意義不同。在web framework中是指具體處理GET/POST這些請(qǐng)求之前的一個(gè)通用處理(往往是鏈?zhǔn)秸{(diào)用),比如可以把鑒權(quán)、一些日志處理和請(qǐng)求記錄放在這里。但在后端架構(gòu)設(shè)計(jì)中的middleware則是指類似消息隊(duì)列、緩存這些在最終數(shù)據(jù)庫(kù)之前的中間服務(wù)組件。

***這里是想說web framework并不是包治百病,實(shí)際上那只是提供了基礎(chǔ)功能的一個(gè)library,作為開發(fā)者則更多需要考慮如何定義配置文件,一些敏感參數(shù)如token、密碼怎么傳進(jìn)來,開發(fā)環(huán)境和生產(chǎn)環(huán)境的配置如何自動(dòng)切換,單元測(cè)試怎么搞,代碼目錄怎么組織。有時(shí)候我們可以用一些比如Yeoman之類的scaffold工具來自動(dòng)生成項(xiàng)目代碼框架,或者類似django這種也可能自動(dòng)生成基本目錄結(jié)構(gòu)。

下面進(jìn)入Middleware環(huán)節(jié)。again,強(qiáng)調(diào)一下這里只是根據(jù)個(gè)人經(jīng)驗(yàn)和感受談?wù)勓莼^程。

這一頁只是大致講一下怎么定義中間件middleware。說句題外話,在美國(guó)灣區(qū)那邊提這個(gè)概念的很少,而阿里又特別喜歡說中間件,兩者相互的交流非常頭痛。灣區(qū)那邊不少google、facebook還有pinterest/uber這些的朋友好幾次都在群里問說啥叫中間件。

中間件這個(gè)概念很含糊,應(yīng)該是阿里提出來的,對(duì)應(yīng)于middleware(不過似乎也不是完全對(duì)應(yīng)),可能是因?yàn)樵缙趈ava的EJB那些概念里面比較強(qiáng)調(diào)middleware這一點(diǎn)吧(個(gè)人猜的)。大致上,如果我們把web后端分為直接處理用戶請(qǐng)求的frontend,***對(duì)數(shù)據(jù)進(jìn)行持久存儲(chǔ)(persistant storage)這兩塊,那么中間對(duì)數(shù)據(jù)的所有處理環(huán)節(jié)都可以視為middleware。

和中間件對(duì)應(yīng)的另一個(gè)阿里發(fā)明的概念是中臺(tái)。近一年多阿里的中臺(tái)概念都相當(dāng)引人注意,這里對(duì)中臺(tái)不做太多描述。總體來說中臺(tái)更多是偏向業(yè)務(wù)和組織架構(gòu)劃分,不能說是一個(gè)技術(shù)概念,也不是面向開發(fā)人員的。而中間件middleware是標(biāo)準(zhǔn)的技術(shù)組件服務(wù)。

那么我們自然會(huì)有一個(gè)問題:為什么要用中間件?

談到為什么要用middlware,這里用推薦系統(tǒng)舉例。

推薦系統(tǒng),對(duì)數(shù)據(jù)少用戶少的情況下,簡(jiǎn)單的mysql即可,比如早期論壇的什么top 10熱門話題啊,最多回復(fù)的話題啊,都可以視為簡(jiǎn)單的推薦,數(shù)據(jù)量又不大的情況下,直接select就可以了。

如果是用戶推薦的話,用戶量不大的情況下,也可以如法炮制,選擇同一區(qū)域(城市)年齡相當(dāng)?shù)漠愋裕?**隨機(jī)挑幾個(gè)給你,相信世紀(jì)佳緣之類的交友網(wǎng)站早期實(shí)現(xiàn)也就是類似的模式。

那么,如果用戶量多了呢?每次都去搜數(shù)據(jù)庫(kù),同時(shí)在線用戶又多,那對(duì)數(shù)據(jù)庫(kù)的壓力就巨大了。這時(shí)候就是引入緩存,memcached、redis就出現(xiàn)了。

簡(jiǎn)單的做法就是把搜索條件作為key,把結(jié)果作為value存入緩存。打個(gè)比方你可以把key存為 20:40:beijing:male (20到40歲之間北京的男性),然后把***次搜索的結(jié)果全部打亂shuffle后,存前1000個(gè),10分鐘過期,再有人用類似條件搜索,就直接把緩存數(shù)據(jù)隨機(jī)挑幾個(gè)返回。放心,一般來說不會(huì)有人10分鐘就把1000個(gè)用戶的資料都看完了,中間偶有重復(fù)也沒人在意(用世紀(jì)佳緣、百合網(wǎng)啥的時(shí)候看到過重復(fù)的吧)。

不過話又說回來,現(xiàn)代數(shù)據(jù)庫(kù),尤其是類似mongodb/es這些大量占用內(nèi)存的nosql,已經(jīng)對(duì)經(jīng)常查詢的數(shù)據(jù)做了緩存,在這之上再加cache,未必真的很有效,這需要case by case去分析了,總之盲目加cache也并不推薦。

加緩存是為了解決訪問速度,減輕數(shù)據(jù)庫(kù)壓力,但是并不提高推薦精準(zhǔn)度。如果我們要提高推薦效果呢?在2015年之前機(jī)器學(xué)習(xí)還沒那么普及成熟的時(shí)候,我們?cè)趺锤隳?

提高推薦效果,在機(jī)器學(xué)習(xí)之前有兩種做法:

- 引入基于lucene的搜索引擎,在搜索的同時(shí)通過定制方案實(shí)現(xiàn)scoring,比如我可以利用lucene對(duì)用戶的年齡、性別、地址等進(jìn)行indexing,但是再返回結(jié)果時(shí)我再根據(jù)用戶和查詢者兩人的具體信息進(jìn)行關(guān)聯(lián),自定義返回的score(可以視為推薦相關(guān)系數(shù))

- 采用離線批處理。固然可以用hadoop,但是就太殺雞用牛刀了。常見的是定時(shí)批處理任務(wù),按某種規(guī)則劃分用戶群體,對(duì)每個(gè)群體再做全量計(jì)算后把推薦結(jié)果寫入緩存。這種可以做很繁復(fù)準(zhǔn)確的計(jì)算,雖然慢,但效果往往不錯(cuò)。這種做法也常用在手機(jī)游戲的PvP對(duì)戰(zhàn)列表里面。

這些處理方法對(duì)社交網(wǎng)絡(luò)/手游這類型的其實(shí)已經(jīng)足夠了,但是新的業(yè)務(wù)是不斷出現(xiàn)的。隨著uber/滴滴/餓了么/美團(tuán)這些需要實(shí)時(shí)處理數(shù)據(jù)的app崛起,作為一個(gè)司機(jī),并不想你上線后過幾分鐘才有客人來吧,你希望你開到一個(gè)熱點(diǎn)區(qū)域,一開機(jī)就馬上接單。

所以這種對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)(近實(shí)時(shí))處理的需求也帶動(dòng)了后端體系的大發(fā)展,kafka/spark等等流處理大行其道。這時(shí)候的后端體系就漸漸引入了消息驅(qū)動(dòng)的模式,所謂消息驅(qū)動(dòng),就是對(duì)新的生產(chǎn)數(shù)據(jù)會(huì)有多個(gè)消費(fèi)者,有的是滿足實(shí)時(shí)計(jì)算的需求(比如司機(jī)信息需要立刻能夠被快速檢索到,又不能每次都做全量indexing,就需要用到spark),有的只是為了數(shù)據(jù)分析,寫入類似cassandra這些數(shù)據(jù)庫(kù)里,還有的可能是為了生成定時(shí)報(bào)表,寫入到mysql。

大數(shù)據(jù)的處理一直是業(yè)界熱點(diǎn)領(lǐng)域。記得2015年硅谷一個(gè)朋友就是從一家小公司做php跳去另一家物聯(lián)網(wǎng)公司做spark相關(guān)的工作,之前還很擔(dān)心玩不轉(zhuǎn),搞了兩年就儼然業(yè)界大佬被oracle挖去負(fù)責(zé)云平臺(tái)~~~

anyway,這時(shí)候?qū)蠖梭w系的要求是一方面能快速滿足實(shí)時(shí)需求,另一方面又能滿足各種耗時(shí)長(zhǎng)的數(shù)據(jù)分析、data lake存儲(chǔ)等等,以及當(dāng)時(shí)漸漸普及的機(jī)器學(xué)習(xí)模型(當(dāng)時(shí)2015年初和幾個(gè)朋友搞startup,其中一個(gè)是walmart lab的機(jī)器學(xué)習(xí)專家,上來就一堆模型,啥數(shù)據(jù)和用戶都還沒有就把模型擺上來了,后來搞得非常頭痛。當(dāng)時(shí)沒有keras/pytorch/tf這些,那堆模型是真心搞不太懂,但是又不敢扔,要靠那東西去包裝拿投資的。。。)

但是我們?cè)倏瓷厦娴膱D,是不是感覺比較亂呢?各種系統(tǒng)的數(shù)據(jù)寫來寫去,是不是有點(diǎn)messy?當(dāng)公司團(tuán)隊(duì)增多,系統(tǒng)復(fù)雜度越來越高的時(shí)候,我們?cè)撛趺词崂?

到了2017之后,前面千奇百怪的后端體系基本上都趨同了。kafka的實(shí)時(shí)消息隊(duì)列,spark的流處理(當(dāng)然現(xiàn)在也可以換成flink,不過大部分應(yīng)該還是spark),然后后端的存儲(chǔ),基于hive的數(shù)據(jù)分析查詢,然后根據(jù)業(yè)務(wù)的模型訓(xùn)練平臺(tái)。各個(gè)公司反正都差不多這一套,在具體細(xì)節(jié)上根據(jù)業(yè)務(wù)有所差異,或者有些實(shí)力強(qiáng)大的公司會(huì)把中間一些環(huán)節(jié)替換成自己的實(shí)現(xiàn),不過不管怎么千變?nèi)f化,整體思路基本都一致了。

這里可以看到機(jī)器學(xué)習(xí)和AI模型的引入。個(gè)人認(rèn)為,machine learning的很大一個(gè)好處,是簡(jiǎn)化業(yè)務(wù)邏輯,簡(jiǎn)化后臺(tái)流程,不然一套業(yè)務(wù)一套實(shí)現(xiàn),各種數(shù)據(jù)和業(yè)務(wù)規(guī)則很難用一個(gè)整體的技術(shù)平臺(tái)來完成。相比前面一頁的后臺(tái)架構(gòu),這一頁要清晰許多,而且是一個(gè)DAG有向無環(huán)圖的形式,數(shù)據(jù)流向很明確。我們?cè)谙旅嬖賮碚f這個(gè)機(jī)器學(xué)習(xí)對(duì)業(yè)務(wù)數(shù)據(jù)流程的簡(jiǎn)化。

在傳統(tǒng)后端系統(tǒng)中,業(yè)務(wù)邏輯其實(shí)和數(shù)據(jù)是客觀分離的,邏輯規(guī)則和數(shù)據(jù)之間并不存在客觀聯(lián)系,而是人為主觀加入,并沒形成閉環(huán),如上圖左上所示。而基于機(jī)器學(xué)習(xí)的平臺(tái),這個(gè)閉環(huán)就形成了,從業(yè)務(wù)數(shù)據(jù)->AI模型->業(yè)務(wù)邏輯->影響用戶行為->新的業(yè)務(wù)數(shù)據(jù)這個(gè)流程是自給自足的。這在很多推薦系統(tǒng)中表現(xiàn)得很明顯,通過用戶行為數(shù)據(jù)訓(xùn)練模型,模型對(duì)頁面信息流進(jìn)行調(diào)整,從而影響用戶行為,然后用新的用戶行為數(shù)據(jù)再次調(diào)整模型。而在機(jī)器學(xué)習(xí)之前,這些觀察工作是交給運(yùn)營(yíng)人員去手工猜測(cè)調(diào)整。

上圖右邊談的是機(jī)器學(xué)習(xí)相關(guān)后臺(tái)架構(gòu)和傳統(tǒng)web后臺(tái)的一些差別,重點(diǎn)是耗時(shí)太長(zhǎng),必須異步處理。因此消息驅(qū)動(dòng)機(jī)制對(duì)機(jī)器學(xué)習(xí)后臺(tái)是一個(gè)必須的設(shè)計(jì)。

這頁是一些個(gè)人的感受,現(xiàn)代的后端數(shù)據(jù)處理越來越偏向于DAG的形態(tài),Spark不說了,DAG是***特色;神經(jīng)網(wǎng)絡(luò)本身也可以看作是一個(gè)DAG(RNN其實(shí)也可以看作無數(shù)個(gè)單向DNN的組合);tensorflow也是強(qiáng)調(diào)其Graph是DAG,另外編程模式上,Reactive編程也很受追捧。

其實(shí)DAG的形態(tài)重點(diǎn)強(qiáng)調(diào)的就是數(shù)據(jù)本身是immutable(不可修改),只能transform后成為新的數(shù)據(jù)進(jìn)入下一環(huán)。這個(gè)思維其實(shí)可以貫穿到現(xiàn)代后臺(tái)系統(tǒng)設(shè)計(jì)的每個(gè)環(huán)節(jié),比如trakcing、analytics、數(shù)據(jù)表設(shè)計(jì)、microservice等等,但具體實(shí)施還是要case by case了。

無論如何,數(shù)據(jù),數(shù)據(jù)的跟蹤tracking,數(shù)據(jù)的流向,是現(xiàn)代后臺(tái)系統(tǒng)的核心問題,只有data flow和data pipeline清晰了,整個(gè)后臺(tái)架構(gòu)才會(huì)清楚。

數(shù)據(jù)庫(kù)是個(gè)非常復(fù)雜的領(lǐng)域,在下面對(duì)幾個(gè)基本常用的概念做一些介紹。注意一點(diǎn)是graph database在這里沒有提到,因?yàn)槿粘J褂幂^少,相對(duì)來說facebook提出的GraphQL倒是個(gè)有趣的概念,但也只是在傳統(tǒng)db上的一個(gè)概念封裝。

上圖是2018年12月初熱門數(shù)據(jù)庫(kù)的排名,我們可以看到關(guān)系數(shù)據(jù)庫(kù)RDBMS和NOSQL數(shù)據(jù)庫(kù)基本上平分秋色。而NOSQL中實(shí)際上又可以分為key-value storage(包括文檔型)及column based DB.

mysql這個(gè)沒啥好講,大概提一下就是。有趣的是曾經(jīng)看到一篇文章是aws CTO談的一些內(nèi)容,其中印象深刻是:如果你的用戶還不到100萬,就別折騰了,無腦使用mysql吧)

在2015年之前的一個(gè)趨勢(shì)是不少公司使用mysql作為數(shù)據(jù)存儲(chǔ),但是把indexing放在外部去做。這個(gè)思路最早似乎是friendster提出的,后來uber也模仿這種做法設(shè)計(jì)了自己的數(shù)據(jù)庫(kù)schemaless。然而隨著postgreSQL的普及(postgreSQL支持對(duì)json的索引),這種做法是否還有意義就值得商榷了。

nosql最早的使用就是key-value的查找,典型的就是redis。實(shí)際上后來的像mongo這些documentbased db也是類似的key value,只是它對(duì)document中的內(nèi)容又做了一次index (inverted index),用空間換時(shí)間來提供查找數(shù)據(jù),這也是cs不變的思維。

mongo/elasticsearch收到熱捧主要是因?yàn)樗鼈兊膕chemaless屬性,也就是不需要提前定義數(shù)據(jù)格式,只要是json就存,還都能根據(jù)每個(gè)field搜索,這非常方便程序員快速出demo。但是實(shí)際上數(shù)據(jù)量大之后還是要規(guī)范數(shù)據(jù)結(jié)構(gòu),定義需要indexing的field的。

這里提一個(gè)比較好玩的開源project nodebb, 這是個(gè)node.js開發(fā)的論壇系統(tǒng)。在我前幾年看到這個(gè)的時(shí)候它其實(shí)只支持redis,然后當(dāng)時(shí)因?yàn)橐粋€(gè)項(xiàng)目把它改造了讓他支持mysql。去年再看的時(shí)候發(fā)現(xiàn)它同時(shí)支持了redis/postres/mongo,如果對(duì)比一下同樣的功能他如何在這三種db實(shí)現(xiàn)的,相信會(huì)很有幫助。

稍微談?wù)劻写鎯?chǔ)。常見mysql你在select的時(shí)候其實(shí)往往會(huì)把整行都讀出來,再在其中挑那么一兩個(gè)你需要的屬性,非常浪費(fèi)。而mongo這些文件型db,又不支持常見SQL。而列存儲(chǔ)DB的好處就是快,不用把一行所有信息讀出來,只是按列讀取你需要的,對(duì)現(xiàn)在的大數(shù)據(jù)分析特別是OLAP(Online Analytical Processing)來說特別重要。然而據(jù)另外的說法,實(shí)際上像casssandra/hbase這些并不是真正的列存儲(chǔ),而只是借用了一些概念。這個(gè)我也沒深入去了解,有興趣的同學(xué)可以自己研究研究。

列存儲(chǔ)的一個(gè)重要領(lǐng)域是時(shí)序數(shù)據(jù)庫(kù),物聯(lián)網(wǎng)用得多。其特色是大量寫入,只增不改(不修改數(shù)據(jù)),但是讀的次數(shù)相對(duì)于很少(想想物聯(lián)網(wǎng)的特點(diǎn),隨時(shí)有數(shù)據(jù)寫入,但是你不會(huì)隨時(shí)都在看你家小米電器的狀態(tài)。。。)

注意說write/read是正交的。這意思是每次寫入是一次一行,而讀是按列,加上又不會(huì)修改數(shù)據(jù),因此各自都能保持極快的速度

下面簡(jiǎn)單談一下微服務(wù),大部分直接看PPT就可以了,有幾頁略微談一下個(gè)人思考。

上面這頁說說,其實(shí)微服務(wù)所謂的服務(wù)發(fā)現(xiàn)/name service不要被忽悠覺得是多神奇的東西。最簡(jiǎn)單的Nginx/Apache這些都能做(域名轉(zhuǎn)向,proxy),或者你要寫個(gè)name : address的對(duì)應(yīng)關(guān)系到db里面也完全可以,再配一個(gè)定時(shí)healthcheck的服務(wù),最簡(jiǎn)單的服務(wù)發(fā)現(xiàn)也就行了。

高級(jí)點(diǎn)用到zookeeper/etcd等等,或者SpringCloud全家桶,那只是簡(jiǎn)化配置,原理都一樣。從開發(fā)角度來看,微服務(wù)的開發(fā)并不是難點(diǎn),難點(diǎn)是微服務(wù)的配置和部署。最近一段時(shí)間微服務(wù)部署也是業(yè)界熱點(diǎn),除了全家桶形態(tài)的SpringCloud,也可以看看lstio這些開源工具。

 

上圖主要大致對(duì)比一下,看看從早期的Spring到現(xiàn)在Spring Cloud的變化。想來用過Java Tomcat的朋友都能體會(huì)Java這一套Config based development的繁瑣,開發(fā)的精力很多不是在業(yè)務(wù)代碼上,往往會(huì)化不少精力去折騰配置文件。當(dāng)然,Spring Cloud在這方面簡(jiǎn)化了不少,不過個(gè)人還是不太喜歡java,搞很多復(fù)雜的設(shè)計(jì)模式,封裝了又封裝。

這里要說并不是微服務(wù)解決一切,熱門的Python Django盡管有restful-framework,但是它實(shí)際上是一個(gè)典型的Monolithic體系。對(duì)很多核心業(yè)務(wù),其實(shí)未必要拆開成微服務(wù)。

這兩者是互補(bǔ)關(guān)系,不是替代關(guān)系。

下面的docker我就不仔細(xì)談了,PPT基本表達(dá)了我想表述的概念,主要意思是

- docker能夠簡(jiǎn)化部署,簡(jiǎn)化開發(fā),能夠在某種程度上讓開發(fā)環(huán)境和產(chǎn)品環(huán)境盡量接近

- 不要擔(dān)心docker的性能,它不是虛擬機(jī),可以看作在server上運(yùn)行的一個(gè)process。

上圖是描述docker之前開發(fā)人員的常見開發(fā)環(huán)境,首先在自己機(jī)器上裝一大堆服務(wù),像mysql, redis, tomcat啥的。也有直接在遠(yuǎn)程服務(wù)器安裝環(huán)境后,多人共同登錄遠(yuǎn)端開發(fā),各自使用一個(gè)端口避免沖突…. 實(shí)際上這種土法煉鋼的形態(tài),在2019年的今天仍然在國(guó)內(nèi)非常普及。

這種形態(tài)的后果就是在***發(fā)布到生產(chǎn)環(huán)境時(shí),不同開發(fā)人員會(huì)經(jīng)歷長(zhǎng)時(shí)間的“聯(lián)調(diào)”,各種端口、權(quán)限、腳本、環(huán)境設(shè)置在生產(chǎn)環(huán)境再來一遍…這也是過去運(yùn)維人員的主要工作。

上一頁提到的問題,并不是一定要docker來解決。在這之前,虛擬機(jī)VM的出現(xiàn),以及vagrant這樣的工具,都讓開發(fā)環(huán)境的搭建多少輕松了一些。不過思路仍然是把VM作為一個(gè)獨(dú)立服務(wù)器使用,只是因?yàn)榭煺铡㈢R像和輔助工具,讓環(huán)境的配置、統(tǒng)一和遷移更加簡(jiǎn)單快捷。

上圖是對(duì)比程序運(yùn)行在物理服務(wù)器、VM及docker時(shí)的資源共享情況,可以看到運(yùn)行在Docker的應(yīng)用,并沒有比并發(fā)運(yùn)行在物理服務(wù)器上占用更多資源。

下圖是簡(jiǎn)單的docker使用,不做贅述。

這一頁主要是強(qiáng)調(diào)Docker并不等同于虛擬機(jī)。虛擬機(jī)所占資源是獨(dú)享的,比如你啟動(dòng)一個(gè)VM,分配2G內(nèi)存,那么這個(gè)VM里不管是否運(yùn)行程序都會(huì)占用2G內(nèi)存。然而如果你啟動(dòng)一個(gè)Docker,里面運(yùn)行一個(gè)簡(jiǎn)單web服務(wù),在不強(qiáng)制指定內(nèi)存占用情況下,如果沒有請(qǐng)求進(jìn)入,沒有額外占用內(nèi)存,那么這個(gè)docker服務(wù)對(duì)整機(jī)的內(nèi)存占用幾乎為0(當(dāng)然仍然存在一些開銷,但主要是根據(jù)該程序自身的運(yùn)行狀況而定)。

***Kubernetes這里大概說說host-pod-container的關(guān)系,一個(gè)host可以是物理機(jī)或者vm,pod不是一個(gè)docker,而是可以看作有一個(gè)ip的...(不知道怎么形容),總之一個(gè)pod可以包括多個(gè)container(docker),pod之中的container可以共享該pod的資源(ip,storage等)。不過現(xiàn)實(shí)中似乎大多是一個(gè)pod對(duì)一個(gè)container。

對(duì)互聯(lián)網(wǎng)一些熱門概念和演變過程的一個(gè)很簡(jiǎn)略的描述就到這里了,謝謝。

【本文為51CTO專欄作者“騰訊技術(shù)工程”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者(微信號(hào):Tencent_TEG)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2018-07-26 07:21:12

2015-11-11 09:16:30

2013-12-31 09:49:48

2023-12-05 10:33:15

工業(yè)互聯(lián)網(wǎng)互聯(lián)網(wǎng)平臺(tái)

2019-11-27 10:11:22

勒索病毒網(wǎng)絡(luò)安全

2014-01-15 14:35:35

云計(jì)算

2018-07-23 10:17:27

2019-09-03 15:46:18

2011-11-10 15:09:04

廣告移動(dòng)互聯(lián)網(wǎng)

2014-10-08 16:47:02

GITC2014全球互聯(lián)網(wǎng)技術(shù)大會(huì)

2017-10-27 14:52:31

互聯(lián)網(wǎng)高可用架構(gòu)高可用

2015-10-26 11:39:54

互聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)分布式

2012-05-23 11:44:26

網(wǎng)易互聯(lián)網(wǎng)互聯(lián)網(wǎng)變?cè)?/a>

2019-11-05 08:46:29

工業(yè)互聯(lián)網(wǎng)物聯(lián)網(wǎng)IOT

2019-11-07 22:53:10

工業(yè)互聯(lián)網(wǎng)物聯(lián)網(wǎng)IOT

2019-07-30 09:08:04

2023-04-19 14:20:13

2012-09-18 13:58:58

互聯(lián)網(wǎng)創(chuàng)業(yè)架構(gòu)

2017-10-15 14:36:10

互聯(lián)網(wǎng)分層架構(gòu)服務(wù)化

2020-08-11 09:43:28

分層架構(gòu)互聯(lián)網(wǎng)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧美在线观看 | 亚洲成人一区 | av中文字幕在线 | 亚洲国产欧美国产综合一区 | 嫩草视频网 | 狠狠色狠狠色综合系列 | av在线免费不卡 | 91av免费版| 成人不卡| 久久久国产一区二区三区 | 欧美日产国产成人免费图片 | 中文天堂网 | 国产精品视频不卡 | 在线不卡视频 | 欧美在线视频二区 | 亚洲国产精品久久 | 亚洲天天 | 91看片| 在线午夜| 中文字幕一区二区三区精彩视频 | 中文字幕爱爱视频 | 99精品99| 欧美一级毛片在线播放 | 精品国产精品三级精品av网址 | 操操操av| 国精产品一区一区三区免费完 | 午夜丰满少妇一级毛片 | 不卡视频一区二区三区 | 成人精品一区二区三区中文字幕 | 亚洲精品视频一区二区三区 | 精品亚洲视频在线 | 中文字幕高清 | 久久亚洲国产 | 午夜影院普通用户体验区 | 久久国产成人精品国产成人亚洲 | 一区二区国产精品 | 在线播放国产一区二区三区 | 男人的天堂在线视频 | 国产伦精品一区二区 | 神马九九| 久草免费在线视频 |