軟件架構(gòu)演變:從單體架構(gòu)到LLM鏈?zhǔn)秸{(diào)用

0 前言

軟件架構(gòu)——我們數(shù)字世界的藍(lán)圖——自20世紀(jì)中葉計(jì)算機(jī)時(shí)代誕生以來(lái),已經(jīng)發(fā)生了巨大演變。 20世紀(jì)60年代和70年代早期,以大型主機(jī)和單體軟件為主導(dǎo)。而今天,數(shù)字領(lǐng)域已完全不同,運(yùn)行在由云計(jì)算、API連接、AI算法、微服務(wù)和編排平臺(tái)組成的分布式網(wǎng)絡(luò)上。

軟件架構(gòu)是如何隨著歲月演變的?回顧幾十年來(lái)的技術(shù)進(jìn)步,我們可以看到商業(yè)需求、市場(chǎng)趨勢(shì)和工程實(shí)踐的變化如何影響了軟件架構(gòu)。

1 大型主機(jī)和單體架構(gòu):約1940年代

最早的計(jì)算機(jī)是大型主機(jī)計(jì)算機(jī)——占據(jù)一個(gè)房間的大型強(qiáng)力硬件設(shè)備。大型主機(jī)最初是獨(dú)立的機(jī)器,能夠執(zhí)行復(fù)雜的計(jì)算任務(wù)。在20世紀(jì)70年代之前,向大型主機(jī)發(fā)送指令通常使用打孔卡或磁帶,輸出則通過(guò)打印機(jī)接收。

1950年代的數(shù)據(jù)中心注釋圖示,包含中央處理器、磁帶單元、磁帶控制器、輸入/輸出控制器、控制臺(tái)、打孔卡、卡片讀取器、磁盤(pán)存儲(chǔ)和高速打印機(jī):

20世紀(jì)70年代之前,數(shù)據(jù)中心中安裝了可以接收打孔卡或磁帶指令的大型主機(jī)。圖片來(lái)源:未知。

第一臺(tái)大型主機(jī)計(jì)算機(jī)是哈佛馬克一號(hào)(Harvard Mark I)和ENIAC,分別在20世紀(jì)30年代和40年代為軍事和研究目的而開(kāi)發(fā)。1948年,首臺(tái)商用大型主機(jī)UNIVAC問(wèn)世。接下來(lái)的幾十年,大型主機(jī)憑借其在批處理事務(wù)數(shù)據(jù)方面的卓越能力,迅速被銀行、金融和航空公司廣泛采用。至今,許多此類(lèi)系統(tǒng)仍在使用中。

大型主機(jī)應(yīng)用通常使用COBOL(通用商業(yè)導(dǎo)向語(yǔ)言)編寫(xiě),至今仍在大型主機(jī)環(huán)境中流行。這些應(yīng)用的軟件架構(gòu)是單體式的,即整個(gè)代碼庫(kù)是一個(gè)整體,包含數(shù)據(jù)架構(gòu)、應(yīng)用方法、數(shù)據(jù)庫(kù)連接、展示邏輯等,未做模塊化設(shè)計(jì)。要更新這些組件的任何一個(gè),開(kāi)發(fā)人員都需要訪問(wèn)整個(gè)代碼庫(kù),并將其以一個(gè)整體包重新部署。

單體架構(gòu)圖示,用戶(hù)界面、應(yīng)用邏輯和數(shù)據(jù)庫(kù)存儲(chǔ)在單一代碼庫(kù)中,一起部署:

2 網(wǎng)絡(luò)和客戶(hù)端-服務(wù)器:約1950年代

網(wǎng)絡(luò)連接計(jì)算機(jī)并促進(jìn)它們之間的通信——從大型主機(jī)到終端、大型主機(jī)到大型主機(jī),后來(lái)擴(kuò)展到客戶(hù)端到服務(wù)器。從1958年開(kāi)始,網(wǎng)絡(luò)技術(shù)的發(fā)展使得大型主機(jī)可以通過(guò)電子方式連接,將其轉(zhuǎn)變?yōu)榭梢赃B接多個(gè)終端的多用戶(hù)計(jì)算機(jī)。取代了打孔卡和打印機(jī),人們可以使用顯示器、鍵盤(pán)和命令行界面(CLI)來(lái)發(fā)送和接收數(shù)據(jù)。

技術(shù)限制制約了最初的幾臺(tái)互聯(lián)計(jì)算機(jī)系統(tǒng)。例如,多路復(fù)用大型主機(jī)只能在本地使用,因?yàn)殡娎|長(zhǎng)度的限制要求終端與大型主機(jī)的位置非常接近。這些早期的數(shù)據(jù)中心不僅包含計(jì)算機(jī),還有大量的人力向大型主機(jī)發(fā)送任務(wù)。

ARPANET是首個(gè)公共的廣域計(jì)算機(jī)網(wǎng)絡(luò),1969年正式上線。它使用分組交換來(lái)傳輸數(shù)據(jù),這成為了我們今天所知的現(xiàn)代互聯(lián)網(wǎng)的基礎(chǔ)。

網(wǎng)絡(luò)技術(shù)在1980年代推動(dòng)了客戶(hù)端-服務(wù)器結(jié)構(gòu)的普及,其中應(yīng)用分為服務(wù)器軟件和通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)通信的客戶(hù)端軟件。這種結(jié)構(gòu)在今天很常見(jiàn):客戶(hù)端,通常是臺(tái)式計(jì)算機(jī),遠(yuǎn)程向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器返回響應(yīng)。通過(guò)分配計(jì)算資源,服務(wù)器負(fù)責(zé)數(shù)據(jù)處理和檢索,而客戶(hù)端負(fù)責(zé)展示數(shù)據(jù)。

客戶(hù)端-服務(wù)器架構(gòu)圖示,客戶(hù)端側(cè)包含用戶(hù)界面,向服務(wù)器側(cè)發(fā)出請(qǐng)求,應(yīng)用邏輯和數(shù)據(jù)庫(kù)存儲(chǔ)在服務(wù)器上:

首批客戶(hù)端-服務(wù)器應(yīng)用是郵件服務(wù)、Web服務(wù)器以及其他具有在線功能的桌面應(yīng)用程序。如今,客戶(hù)端-服務(wù)器已成為大多數(shù)應(yīng)用程序的標(biāo)準(zhǔn)范式,更廣義上涵蓋了服務(wù)請(qǐng)求方和服務(wù)提供方的通用模型。

盡管存在兩層分離,許多此類(lèi)應(yīng)用程序仍然是單體構(gòu)建的。所有應(yīng)用功能都在單一代碼庫(kù)中,緊密耦合,并共享一個(gè)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限。

3 萬(wàn)維網(wǎng)、網(wǎng)站和Web應(yīng)用:約1980年代

1983年標(biāo)志著互聯(lián)網(wǎng)時(shí)代的到來(lái)。 互聯(lián)網(wǎng)是使用TCP/IP協(xié)議在設(shè)備和應(yīng)用之間傳輸通信的全球計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)。這是FTP程序、SSH系統(tǒng)以及當(dāng)然還有萬(wàn)維網(wǎng)(WWW)的基礎(chǔ)。

盡管互聯(lián)網(wǎng)和萬(wàn)維網(wǎng)如今經(jīng)常被混用,但萬(wàn)維網(wǎng)實(shí)際上是幾乎十年后在1990年才發(fā)明的。萬(wàn)維網(wǎng)是一個(gè)信息系統(tǒng)——一個(gè)由HTML內(nèi)容和鏈接組成的網(wǎng)絡(luò)——通過(guò)互聯(lián)網(wǎng)使用HTTP協(xié)議共享和組織信息。這種信息存儲(chǔ)方式在全球范圍內(nèi)可訪問(wèn),為網(wǎng)站和網(wǎng)絡(luò)編程時(shí)代鋪平了道路。

早期的網(wǎng)站是靜態(tài)頁(yè)面,從Web服務(wù)器上顯示數(shù)據(jù)。1993年“通用網(wǎng)關(guān)接口”(CGI)的引入,使Web的交互性開(kāi)始嶄露頭角,開(kāi)啟了Web應(yīng)用的前景。

隨著1995年JavaScript的發(fā)明,Web交互性迅速發(fā)展,JavaScript將腳本邏輯引入客戶(hù)端。它很快成為Web編程的新標(biāo)準(zhǔn),Web服務(wù)器可以更輕松地提供動(dòng)態(tài)、交互式內(nèi)容。早期的論壇、公告欄和Web表單正是這一時(shí)期的產(chǎn)物。

Web的發(fā)明及其潛在可能性很快引發(fā)了下一波應(yīng)用開(kāi)發(fā)浪潮。與其為應(yīng)用程序構(gòu)建一個(gè)專(zhuān)用客戶(hù)端,不如簡(jiǎn)單地構(gòu)建一個(gè)可以托管在Web上的網(wǎng)站。

4 面向服務(wù)的架構(gòu)和Web服務(wù):約1990年代

隨著應(yīng)用開(kāi)發(fā)的發(fā)展,單一代碼庫(kù)變得越來(lái)越難以管理,而且很明顯一個(gè)系統(tǒng)中包含的功能或數(shù)據(jù)可以在另一個(gè)系統(tǒng)中復(fù)用。

為了解決這些問(wèn)題,模塊化成為討論的主題。在20世紀(jì)90年代,服務(wù)器端進(jìn)一步分為兩層:應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器。應(yīng)用服務(wù)器存儲(chǔ)所有的應(yīng)用和業(yè)務(wù)邏輯,而數(shù)據(jù)庫(kù)服務(wù)器則存儲(chǔ)數(shù)據(jù)記錄,這種分離降低了高處理量下的延遲。

大約在同一時(shí)間,面向服務(wù)的架構(gòu)(SOA)作為一種架構(gòu)模式出現(xiàn),其中軟件功能被設(shè)計(jì)成獨(dú)立的服務(wù),只要系統(tǒng)遵循其使用規(guī)范,這些服務(wù)可以與任何系統(tǒng)一起使用。SOA鼓勵(lì)開(kāi)發(fā)企業(yè)應(yīng)用時(shí)將其分解為松散耦合的服務(wù),這些服務(wù)通過(guò)網(wǎng)絡(luò)上的通信協(xié)議交互,這種模式至今仍占主導(dǎo)地位。

在SOA模式下,一個(gè)購(gòu)物應(yīng)用可能包含多個(gè)服務(wù):一個(gè)用于庫(kù)存跟蹤,另一個(gè)用于訂單處理,還有一個(gè)用于用戶(hù)認(rèn)證。與基于微服務(wù)的應(yīng)用不同,SOA模式中的服務(wù)仍然通過(guò)應(yīng)用層共享同一個(gè)數(shù)據(jù)庫(kù)。

面向服務(wù)的架構(gòu)圖示(SOA),應(yīng)用邏輯被分成獨(dú)立的服務(wù),盡管這些服務(wù)共享一個(gè)數(shù)據(jù)庫(kù):

隨SOA發(fā)展,出現(xiàn)了制定一套標(biāo)準(zhǔn)和協(xié)議以定義這些服務(wù)與各種客戶(hù)端之間的交互需求。DCOM和CORBA是一些非基于Web的標(biāo)準(zhǔn),但很快被SOAP和REST API等基于Web的標(biāo)準(zhǔn)所取代。SOA提供了一種方式,讓不同提供商的服務(wù)可以整合到一個(gè)應(yīng)用中,或者讓同一個(gè)服務(wù)在不同的客戶(hù)端上使用,比如Web門(mén)戶(hù)或?qū)S米烂娼涌凇?/p>

5 虛擬機(jī)和云計(jì)算:約2000年代

SOA為從傳統(tǒng)的桌面應(yīng)用向一種新型軟件應(yīng)用模式——SaaS(軟件即服務(wù))過(guò)渡鋪平了道路,但虛擬機(jī)和云計(jì)算的出現(xiàn)進(jìn)一步推動(dòng)了未來(lái)幾十年SaaS產(chǎn)品的快速增長(zhǎng)。

虛擬機(jī)(Virtual Machine)是存在于軟件層而非物理機(jī)上的計(jì)算機(jī)系統(tǒng),由管理程序(hypervisor)支持實(shí)現(xiàn)。 利用虛擬機(jī),可以更輕松地創(chuàng)建、更新和銷(xiāo)毀多個(gè)運(yùn)行不同操作系統(tǒng)的機(jī)器,從而在應(yīng)用開(kāi)發(fā)過(guò)程中最大化資源分配和利用。

虛擬機(jī)圖示,虛擬機(jī)通過(guò)管理程序運(yùn)行在同一物理機(jī)上:

雖然機(jī)器虛擬化自20世紀(jì)60年代就已存在,但直到2000年代隨著Linux、Microsoft和VMware的快速發(fā)布,才進(jìn)入主流使用階段。這段時(shí)間,亞馬遜等公司發(fā)現(xiàn)了虛擬化帶來(lái)的商業(yè)機(jī)會(huì):管理型云計(jì)算服務(wù)。物理裸機(jī)昂貴且難以管理,對(duì)于需要擴(kuò)展的公司來(lái)說(shuō)是一個(gè)限制因素。有了Amazon EC2這樣的云計(jì)算服務(wù),公司可以租用虛擬機(jī)獲得處理能力并根據(jù)需求進(jìn)行擴(kuò)展。

像Facebook和Netflix這樣的新興公司,得以專(zhuān)注于構(gòu)建其軟件功能,而無(wú)需維護(hù)底層硬件和數(shù)據(jù)中心。啟動(dòng)的技術(shù)門(mén)檻顯著降低,加速了未來(lái)數(shù)十年初創(chuàng)公司和數(shù)字化原生業(yè)務(wù)的崛起。隨之而來(lái)的是分布式計(jì)算和軟件架構(gòu)的下一步發(fā)展:微服務(wù)。

6 API、容器與微服務(wù)的崛起:約2010年代

2010年代是多個(gè)向分布式計(jì)算趨勢(shì)匯集的時(shí)代。由于需要讓第三方訪問(wèn)其服務(wù),2000年Salesforce和eBay推出了首批商業(yè)API,允許其合作伙伴或客戶(hù)在自己的網(wǎng)站或應(yīng)用中集成功能。從Twitter和Google Maps到Stripe、Twilio以及如今的OpenAI,API經(jīng)濟(jì)迅速膨脹,推動(dòng)了網(wǎng)絡(luò)上的功能集成。

同樣,微服務(wù)架構(gòu)在像Amazon和Netflix這樣的擴(kuò)展型公司中開(kāi)始流行起來(lái),這些公司需要加快和簡(jiǎn)化開(kāi)發(fā)周期,而這一進(jìn)程常被單體代碼庫(kù)拖慢。通過(guò)將應(yīng)用分解為獨(dú)立的微服務(wù),每個(gè)微服務(wù)都有自己的數(shù)據(jù)庫(kù),各團(tuán)隊(duì)可以獨(dú)立更新和部署,帶來(lái)了更快速的發(fā)布和改進(jìn)。

基于微服務(wù)的架構(gòu)圖示,獨(dú)立的服務(wù)與獨(dú)立數(shù)據(jù)庫(kù)連接,可以獨(dú)立部署:

雖然有多種方式來(lái)打包和部署微服務(wù)——可以運(yùn)行在物理機(jī)或虛擬機(jī)上——微服務(wù)架構(gòu)的增長(zhǎng)也得益于容器的出現(xiàn)。與虛擬機(jī)類(lèi)似,容器也是一個(gè)抽象層,概念上自20世紀(jì)70年代提出,但直到2013年Docker開(kāi)源后才進(jìn)入企業(yè)領(lǐng)域。

與虛擬機(jī)相比,容器提供了更高水平的隔離,因此多個(gè)相同應(yīng)用的實(shí)例和版本可以在同一操作系統(tǒng)上運(yùn)行。運(yùn)行應(yīng)用程序所需的所有組件——代碼、運(yùn)行時(shí)、庫(kù)、依賴(lài)項(xiàng)和系統(tǒng)工具——都存儲(chǔ)在容器內(nèi),這為部署應(yīng)用或微服務(wù)提供了更高的可移植性和可擴(kuò)展性。

容器圖示,容器是一種抽象層,能實(shí)現(xiàn)應(yīng)用或微服務(wù)的隔離:

現(xiàn)代應(yīng)用開(kāi)發(fā)需要一種健全的方式來(lái)架構(gòu)和整合本地或第三方服務(wù)、數(shù)據(jù)庫(kù)等各種組件。這就引出了今天的軟件架構(gòu):編排和事件系統(tǒng)。

7 編排、事件系統(tǒng)與分布式依賴(lài)問(wèn)題的解決:當(dāng)代

隨著計(jì)算模式向分布式模式發(fā)展——微服務(wù)、API以及某種程度上的SOA——軟件架構(gòu)面臨一個(gè)突出的挑戰(zhàn):這些獨(dú)立的服務(wù)、數(shù)據(jù)庫(kù)和組件如何進(jìn)行通信和交互,以形成一個(gè)協(xié)調(diào)一致的流程?

解決分布式服務(wù)間依賴(lài)問(wèn)題的主要方法有兩種:事件驅(qū)動(dòng)架構(gòu)和編排。

7.1 事件驅(qū)動(dòng)架構(gòu)

在事件驅(qū)動(dòng)架構(gòu)中,服務(wù)會(huì)將數(shù)據(jù)推送到一個(gè)服務(wù)總線或事件管道中,任何連接的服務(wù)都可以讀取并在必要時(shí)執(zhí)行相關(guān)操作。 整體系統(tǒng)響應(yīng)事件或狀態(tài)變化,而不跟蹤單個(gè)事件對(duì)其他事件的影響,從而降低服務(wù)之間依賴(lài)性。

盡管服務(wù)總線的概念自SOA出現(xiàn)以來(lái)就已存在,但隨著微服務(wù)的普及,它得到了進(jìn)一步推廣,代表性技術(shù)包括Kafka和Amazon SQS。事件驅(qū)動(dòng)系統(tǒng)使得系統(tǒng)可以實(shí)時(shí)更新并提高響應(yīng)能力,同時(shí)在并行處理中提升吞吐量。這一架構(gòu)支持快速更新的系統(tǒng),如網(wǎng)約車(chē)或機(jī)票交易系統(tǒng)。

事件驅(qū)動(dòng)架構(gòu)圖示,服務(wù)(生產(chǎn)者)將數(shù)據(jù)(稱(chēng)為事件)推入事件流中,其他服務(wù)(消費(fèi)者)可以訂閱并接收事件:

7.2 編排

編排為解決微服務(wù)依賴(lài)性問(wèn)題以及事件驅(qū)動(dòng)架構(gòu)中遇到的問(wèn)題提供了另一種可行方案。在編排模式中,中心協(xié)調(diào)器按照預(yù)定義的流程調(diào)度每項(xiàng)任務(wù)或微服務(wù),僅在前一任務(wù)成功完成后才繼續(xù)下一個(gè)任務(wù)。 不同于事件流,編排器會(huì)跟蹤整個(gè)流程的進(jìn)度,使開(kāi)發(fā)人員能夠更輕松地追蹤和調(diào)試錯(cuò)誤,實(shí)施故障補(bǔ)償機(jī)制。

編排圖示,各服務(wù)、數(shù)據(jù)庫(kù)、事件流等連接至中央編排器,協(xié)調(diào)各組件進(jìn)入有向的工作流:

8 使用xxx Conductor

利用先進(jìn)的工作流編排平臺(tái)如xxx Conductor,可在分布式計(jì)算領(lǐng)域釋放開(kāi)發(fā)者的生產(chǎn)力。廣泛應(yīng)用于[微服務(wù)編排]、[事件處理]和[LLM鏈?zhǔn)秸{(diào)用],xxx Conductor幫助團(tuán)隊(duì)輕松構(gòu)建具備高彈性和可擴(kuò)展性的系統(tǒng):

  • 可視化工作流編輯器— 使用數(shù)十種集成、定制任務(wù)和內(nèi)置的系統(tǒng)任務(wù)及操作器,涵蓋API、Webhook、數(shù)據(jù)庫(kù)及LLM,通過(guò)可視化方式構(gòu)建和編輯工作流
  • 彈性能力—在Conductor的穩(wěn)健基礎(chǔ)設(shè)施上以最小延遲運(yùn)行數(shù)百萬(wàn)個(gè)并發(fā)工作流,設(shè)計(jì)為耐久、快速和具備冗余
  • 故障處理—提供速率限制、重試策略、超時(shí)等原生支持
  • 版本管理—無(wú)中斷地對(duì)工作流進(jìn)行版本控制,確保生產(chǎn)運(yùn)行穩(wěn)定
  • 內(nèi)省與指標(biāo)—檢查工作流性能和日志,以便于測(cè)試和調(diào)試,并獲取吞吐量等聚合分析
  • 企業(yè)級(jí)安全性—通過(guò)SSO、RBAC和密鑰變量實(shí)現(xiàn)安全訪問(wèn)

關(guān)注我,緊跟本系列專(zhuān)欄文章,咱們下篇再續(xù)!

作者簡(jiǎn)介:魔都架構(gòu)師,多家大廠后端一線研發(fā)經(jīng)驗(yàn),在分布式系統(tǒng)設(shè)計(jì)、數(shù)據(jù)平臺(tái)架構(gòu)和AI應(yīng)用開(kāi)發(fā)等領(lǐng)域都有豐富實(shí)踐經(jīng)驗(yàn)。

各大技術(shù)社區(qū)頭部專(zhuān)家博主。具有豐富的引領(lǐng)團(tuán)隊(duì)經(jīng)驗(yàn),深厚業(yè)務(wù)架構(gòu)和解決方案的積累。

負(fù)責(zé):

  • 中央/分銷(xiāo)預(yù)訂系統(tǒng)性能優(yōu)化
  • 活動(dòng)&券等營(yíng)銷(xiāo)中臺(tái)建設(shè)
  • 交易平臺(tái)及數(shù)據(jù)中臺(tái)等架構(gòu)和開(kāi)發(fā)設(shè)計(jì)
  • 車(chē)聯(lián)網(wǎng)核心平臺(tái)-物聯(lián)網(wǎng)連接平臺(tái)、大數(shù)據(jù)平臺(tái)架構(gòu)設(shè)計(jì)及優(yōu)化
  • LLM Agent應(yīng)用開(kāi)發(fā)
  • 區(qū)塊鏈應(yīng)用開(kāi)發(fā)
  • 大數(shù)據(jù)開(kāi)發(fā)挖掘經(jīng)驗(yàn)
  • 推薦系統(tǒng)項(xiàng)目

目前主攻市級(jí)軟件項(xiàng)目設(shè)計(jì)、構(gòu)建服務(wù)全社會(huì)的應(yīng)用系統(tǒng)。

參考:

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容