2023-06-30 10:02:03來(lái)源:今日頭條
通常,軟件工程師在處理系統(tǒng)設(shè)計(jì)任務(wù)時(shí)遇到困難的主要原因有三個(gè):
系統(tǒng)設(shè)計(jì)任務(wù)往往沒(méi)有固定的結(jié)構(gòu),工程師需要處理一個(gè)開(kāi)放性的設(shè)計(jì)問(wèn)題,這些問(wèn)題并沒(méi)有標(biāo)準(zhǔn)的解決方案。例如,在開(kāi)發(fā)一個(gè)新的電商平臺(tái)時(shí),可能需要從零開(kāi)始設(shè)計(jì)整個(gè)后臺(tái)架構(gòu),而這個(gè)問(wèn)題沒(méi)有唯一正確的答案。工程師在開(kāi)發(fā)復(fù)雜和大規(guī)模系統(tǒng)方面的經(jīng)驗(yàn)不足。例如,他們可能曾經(jīng)在小型項(xiàng)目中充當(dāng)過(guò)主要的開(kāi)發(fā)者,但在處理一個(gè)全球分布式的大型數(shù)據(jù)系統(tǒng)時(shí),他們可能會(huì)感到力不從心。工程師沒(méi)有花足夠的時(shí)間來(lái)研究和準(zhǔn)備如何解決系統(tǒng)設(shè)計(jì)的問(wèn)題。例如,他們可能會(huì)對(duì)編碼技術(shù)有深入的了解,但卻沒(méi)有投入足夠的時(shí)間來(lái)學(xué)習(xí)和理解大規(guī)模系統(tǒng)設(shè)計(jì)的原則和模式。在阿里、騰訊、百度和字節(jié)這樣的知名公司,如果一個(gè)工程師在系統(tǒng)設(shè)計(jì)上的表現(xiàn)不超過(guò)平均水平,他可能會(huì)發(fā)現(xiàn)自己在項(xiàng)目中的影響力有限。相反,表現(xiàn)良好的工程師總會(huì)得到更多的機(jī)會(huì)和認(rèn)可,因?yàn)樗麄冋故境隽颂幚韽?fù)雜系統(tǒng)的能力。
(資料圖片僅供參考)
在這個(gè)課程中,我們將通過(guò)實(shí)際例子,按步驟解決多個(gè)設(shè)計(jì)問(wèn)題。首先,讓我們來(lái)看看這些步驟:
步驟1:明確需求我們?cè)谠噲D解決問(wèn)題時(shí),首先要做的是詢問(wèn)有關(guān)問(wèn)題準(zhǔn)確范圍的問(wèn)題。設(shè)計(jì)問(wèn)題通常是開(kāi)放性的,并且沒(méi)有唯一正確的答案。這就是為什么在項(xiàng)目初期澄清模糊性至關(guān)重要?;ㄗ銐驎r(shí)間定義系統(tǒng)終極目標(biāo)的參與者,總是更有可能在項(xiàng)目中取得成功。此外,由于我們只有35-40分鐘的時(shí)間來(lái)設(shè)計(jì)一個(gè)(可能)大型的系統(tǒng),我們應(yīng)該明確我們將關(guān)注系統(tǒng)的哪些部分。
讓我們用設(shè)計(jì)一個(gè)類(lèi)似微博的服務(wù)的實(shí)際例子來(lái)擴(kuò)展這一點(diǎn)。在進(jìn)行下一步之前,設(shè)計(jì)微博應(yīng)該回答的一些問(wèn)題包括:
我們的服務(wù)用戶能夠發(fā)布微博并關(guān)注其他人嗎?我們是否也需要設(shè)計(jì)創(chuàng)建和展示用戶的時(shí)間線?微博中是否會(huì)包含照片和視頻?我們是否只關(guān)注后端,還是也要開(kāi)發(fā)前端?用戶能否搜索微博?我們需要展示熱門(mén)趨勢(shì)話題嗎?是否會(huì)有新的(或重要的)微博的推送通知?所有這些問(wèn)題都將決定我們的最終設(shè)計(jì)會(huì)是什么樣子。
步驟2:規(guī)模預(yù)估對(duì)我們即將設(shè)計(jì)的系統(tǒng)規(guī)模進(jìn)行預(yù)估總是一個(gè)好的做法。這將有助于我們后續(xù)關(guān)注系統(tǒng)的擴(kuò)展性、數(shù)據(jù)分區(qū)、負(fù)載均衡以及緩存策略。
系統(tǒng)預(yù)期的規(guī)模是什么(例如,新的微博數(shù)量,微博的閱讀數(shù)量,每秒生成時(shí)間線的次數(shù)等)? 我們需要多少存儲(chǔ)空間?如果用戶可以在他們的微博中上傳照片和視頻,我們的存儲(chǔ)需求將有所不同。 我們預(yù)計(jì)將使用多少網(wǎng)絡(luò)帶寬?這將對(duì)我們?nèi)绾喂芾砹髁俊⒃诜?wù)器之間實(shí)現(xiàn)負(fù)載均衡至關(guān)重要。
步驟3:定義系統(tǒng)接口需要明確系統(tǒng)所需的API。這將明確系統(tǒng)預(yù)期的具體協(xié)議,并確保我們對(duì)需求的理解沒(méi)有出錯(cuò)。對(duì)于微博服務(wù),API示例將會(huì)是:
步驟4:定義數(shù)據(jù)模型postTweet(user_id, tweet_data, tweet_location, user_location, timestamp, …)
generateTimeline(user_id, current_time, user_location, …)
markTweetFavorite(user_id, tweet_id, timestamp, …)
在項(xiàng)目初期確定數(shù)據(jù)模型能夠明確數(shù)據(jù)如何在各個(gè)系統(tǒng)組件之間流動(dòng)。隨后,它將成為數(shù)據(jù)分區(qū)和管理的指導(dǎo)。參與者需要確定各種系統(tǒng)實(shí)體,它們?nèi)绾蜗嗷ソ换?,以及?shù)據(jù)管理的各個(gè)方面,例如存儲(chǔ)、傳輸、加密等。對(duì)于微博系統(tǒng)的設(shè)計(jì),以下是一些實(shí)體:
用戶:UserID, Name, Email, DoB, CreationDate, LastLogin等。微博:TweetID, Content, TweetLocation, NumberOfLikes, TimeStamp等。用戶關(guān)注:UserID1, UserID2。喜歡的微博:UserID, TweetID, TimeStamp。我們應(yīng)該選擇哪種數(shù)據(jù)庫(kù)系統(tǒng)?我們是否應(yīng)該選擇類(lèi)似Cassandra這樣的NoSQL來(lái)滿足我們的需求,或者我們應(yīng)該使用像MySQL這樣的解決方案?存儲(chǔ)照片和視頻應(yīng)該使用哪種類(lèi)型的塊存儲(chǔ)?
步驟5:高級(jí)設(shè)計(jì)繪制一個(gè)包含5-6個(gè)表示我們系統(tǒng)核心組件的方框圖。我們需要確定足夠的組件,以便端到端地解決實(shí)際問(wèn)題。
對(duì)于微博,從高層次來(lái)看,我們需要多個(gè)應(yīng)用服務(wù)器來(lái)處理所有讀寫(xiě)請(qǐng)求,同時(shí)在它們前面使用負(fù)載均衡器進(jìn)行流量分配。如果我們預(yù)測(cè)讀取流量(相比寫(xiě)入)會(huì)較大,我們可以決定使用單獨(dú)的服務(wù)器來(lái)處理這些情況。在后端,我們需要一個(gè)能夠存儲(chǔ)所有微博并支持大量讀取的高效數(shù)據(jù)庫(kù)。我們還需要一個(gè)分布式文件存儲(chǔ)系統(tǒng)來(lái)存儲(chǔ)照片和視頻。
步驟6:詳細(xì)設(shè)計(jì)深入研究?jī)傻饺齻€(gè)主要組件;團(tuán)隊(duì)成員的反饋應(yīng)始終指導(dǎo)我們,系統(tǒng)的哪些部分需要進(jìn)一步討論。我們應(yīng)該提出不同的方法,它們的優(yōu)點(diǎn)和缺點(diǎn),并解釋我們?yōu)楹螘?huì)偏好一種方法而非另一種。記住,沒(méi)有唯一的答案;最重要的是在保持系統(tǒng)約束的同時(shí),權(quán)衡不同選項(xiàng)之間的利弊。
由于我們將存儲(chǔ)大量的數(shù)據(jù),我們應(yīng)該如何對(duì)我們的數(shù)據(jù)進(jìn)行分區(qū),以將其分布到多個(gè)數(shù)據(jù)庫(kù)?我們是否應(yīng)該嘗試將用戶的所有數(shù)據(jù)存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù)中?這會(huì)引起什么問(wèn)題? 我們將如何處理那些頻繁發(fā)微博或者關(guān)注很多人的活躍用戶? 由于用戶的時(shí)間線將包含最新的(和相關(guān)的)微博,我們是否應(yīng)嘗試以優(yōu)化掃描最新微博的方式來(lái)存儲(chǔ)我們的數(shù)據(jù)? 我們?cè)谀膫€(gè)層次以及何時(shí)引入緩存以提速? 哪些組件需要更好的負(fù)載均衡?
步驟7:識(shí)別和解決瓶頸嘗試討論盡可能多的瓶頸,以及緩解這些瓶頸的不同方法。
我們的系統(tǒng)中有沒(méi)有任何單點(diǎn)故障?我們正在采取什么措施來(lái)減輕它? 我們是否擁有足夠的數(shù)據(jù)副本,以便在失去一部分服務(wù)器的情況下,仍然能夠?yàn)橛脩籼峁┓?wù)? 同樣,我們是否有足夠的不同服務(wù)的副本在運(yùn)行,以便幾個(gè)失敗不會(huì)導(dǎo)致系統(tǒng)完全停機(jī)? 我們?nèi)绾伪O(jiān)控我們服務(wù)的性能?當(dāng)關(guān)鍵組件失效或性能下降時(shí),我們是否會(huì)得到警報(bào)?
總結(jié)簡(jiǎn)而言之,在項(xiàng)目設(shè)計(jì)階段的準(zhǔn)備和組織是系統(tǒng)設(shè)計(jì)成功的關(guān)鍵。上述步驟應(yīng)該指導(dǎo)你在設(shè)計(jì)系統(tǒng)時(shí)保持正確的方向,并覆蓋所有不同的方面。
關(guān)鍵詞:
通常,軟件工程師在處理系統(tǒng)設(shè)計(jì)任務(wù)時(shí)遇到困難的主要原因有三個(gè):系統(tǒng)
符堯(yao fu@ed ac uk),愛(ài)丁堡大學(xué)(UniversityofEdinburgh)博士生,
當(dāng)今物聯(lián)網(wǎng)的關(guān)鍵是監(jiān)測(cè)各種參數(shù)的傳感器,從運(yùn)動(dòng)到電流再到溫度。這些
截至2023年6月29日收盤(pán)芯導(dǎo)科技688230報(bào)收于4525元上漲371換手率212成
截至6月29日,上交所融資余額報(bào)7864 11億元,較前一交易日增加1 79億元
一、前言最近在項(xiàng)目中使用BigDecimal存儲(chǔ)訂單的數(shù)量,數(shù)據(jù)庫(kù)保留三位小
哈嘍,大家好,我是了不起。最近啥事兒沒(méi)有,真的是只能摸魚(yú)了,前幾天
Java注解的基本概念和語(yǔ)法Java注解是一種為Java程序元素(類(lèi)、方法、變
云計(jì)算、大數(shù)據(jù)、人工智能、區(qū)塊鏈等技術(shù)浪潮賦予金融科技創(chuàng)新源源不斷
一、BlockingQueue在所有的并發(fā)容器中,BlockingQueue是最常見(jiàn)的一種。
新華社北京6月29日電(記者邵藝博、董雪)外交部發(fā)言人毛寧29日表示,
今年以來(lái),武岡市委、市政府深入貫徹落實(shí)黨中央關(guān)于逐步把永久基本農(nóng)田
每經(jīng)AI快訊,證監(jiān)會(huì)數(shù)據(jù)顯示,截至2023年3月底,共有60家機(jī)構(gòu)納入基金
來(lái)為大家解答以上問(wèn)題。啥是汗布,汗布是什么組織結(jié)構(gòu)這個(gè)很多人還不清
1、環(huán)氧瀝青屬于改性瀝青。2、環(huán)氧改性瀝青是由A組分(環(huán)氧樹(shù)脂)和B組分