來源:公眾號(hào)《前端全棧開發(fā)者》
JAM Stack,PostgreSQL和Amazon的DynamoDB都是MongoDB的競(jìng)爭(zhēng)替代品。
NoSQL是用于描述與SQL關(guān)系模型不對(duì)應(yīng)的任何類型的數(shù)據(jù)庫(kù)的名稱。
NoSQL數(shù)據(jù)庫(kù)起源于2009年,當(dāng)時(shí)MySpace等網(wǎng)站規(guī)模不斷擴(kuò)大,之所以出現(xiàn)NoSQL,是因?yàn)楫?dāng)時(shí)的數(shù)據(jù)庫(kù)無法滿足所需的規(guī)模。
MongoDB是最著名的NoSQL數(shù)據(jù)庫(kù)。JAVAScript開發(fā)人員經(jīng)常使用它,尤其是那些使用MERN Stack或MEAN Stack(將Mongo與Express,Angular或React和Node結(jié)合使用)的開發(fā)人員。
人們?yōu)槭裁匆x開MongoDB
一般來說,NoSQL與以往的數(shù)據(jù)庫(kù)架構(gòu)有很大的不同,會(huì)造成記錄丟失,性能下降。NoSQL放棄了一些數(shù)據(jù)庫(kù)的核心功能,這些功能使它們具有高性能且易于使用。作為響應(yīng),許多開發(fā)人員正在考慮從MongoDB和NoSQL轉(zhuǎn)向其他替代方案,例如JAM Stack,PostgreSQL或DynamoDB。
《衛(wèi)報(bào)》離開MongoDB是出了名的
在線出版物和英國(guó)報(bào)紙《衛(wèi)報(bào)》在其2018年11月關(guān)于退出MongoDB的文章中獲得了100,000多次觀看。在這篇文章中,進(jìn)行轉(zhuǎn)換的開發(fā)人員透露,他們的團(tuán)隊(duì)在使用Mongo的數(shù)據(jù)庫(kù)管理軟件OpsManager時(shí)遇到了問題,而Mongo的支持代理在兩次宕機(jī)期間并沒有提供多大幫助。
MongoDB的三種選擇
當(dāng)許多人繼續(xù)使用Mongo時(shí),軟件開發(fā)人員和數(shù)據(jù)庫(kù)工程師可以使用許多替代方法,例如:
- JAM Stack:快速,安全和動(dòng)態(tài)的網(wǎng)站無需Web服務(wù)器即可提供服務(wù)。
- PostgreSQL:SQL數(shù)據(jù)庫(kù)以其可靠性,功能和性能而聞名。
- DynamoDB:Amazon Web Services(AWS)創(chuàng)建的NoSQL數(shù)據(jù)庫(kù)。
這三個(gè)選項(xiàng)是當(dāng)前MongoDB的最佳替代方案,在下一節(jié)中,我們將詳細(xì)介紹每種選擇的利弊。
MongoDB替代方案1:JAM Stack
JAM Stack是JavaScript、API和prerendered Markup的簡(jiǎn)稱,它是一種完全避免需要數(shù)據(jù)庫(kù)的無服務(wù)器架構(gòu)。
JAM Stack甚至可以取一個(gè)文檔數(shù)據(jù)庫(kù),只要數(shù)據(jù)可以移動(dòng)到一大堆用Markdown寫的JSON文件中。
使用JAM Stack時(shí),通常使用Gatsby之類的工具來編譯(或構(gòu)建)整個(gè)應(yīng)用程序。
不幸的是,這意味著任何更改都需要重建站點(diǎn)。
另一方面,如果通過API訪問動(dòng)態(tài)內(nèi)容,則動(dòng)態(tài)內(nèi)容可以實(shí)時(shí)更改,例如通過Disqus處理的評(píng)論。
/ JAM Stack的優(yōu)勢(shì) /
閃電般快速的內(nèi)容交付是JAM Stack的最大優(yōu)勢(shì),因?yàn)樗鼪]有服務(wù)器,整個(gè)應(yīng)用程序都在客戶端運(yùn)行。
同時(shí),還具有最大的seo——因?yàn)樵搼?yīng)用程序已經(jīng)過預(yù)編譯,因此被當(dāng)作靜態(tài)頁面使用,而不是按需生成。
JAM Stack的另一個(gè)優(yōu)勢(shì)是最小的托管成本。例如,靜態(tài)頁面基本上可以免費(fèi)托管在AWS上。
/ JAM Stack的缺點(diǎn) /
每個(gè)更改都必須重新構(gòu)建,這意味著需要重新編譯應(yīng)用程序,然后該更改才能在線上可用。
并且,網(wǎng)站越大,構(gòu)建時(shí)間越長(zhǎng)。
因此,對(duì)于需要頻繁發(fā)布,大量數(shù)據(jù)或?qū)崟r(shí)編輯數(shù)據(jù)記錄的應(yīng)用程序,通常認(rèn)為JAM Stack不適合。
MongoDB替代方案2:PostgreSQL
提倡使用SQL的人提到了SQL架構(gòu)的流行和在SQL數(shù)據(jù)庫(kù)上執(zhí)行操作分析的卓越能力,關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)發(fā)展起來了,它們可以處理幾乎所有的工作負(fù)載,并滿足現(xiàn)代應(yīng)用程序所要求的可擴(kuò)展性、可靠性和可用性。它們可以處理幾乎所有的工作負(fù)載,并具有現(xiàn)代應(yīng)用所要求的可擴(kuò)展性、可靠性和可用性。
換句話說,如果SQL數(shù)據(jù)庫(kù)可以擴(kuò)展,那么它比NoSQL更可取。
PostgreSQL(也稱為Postgres)是一種流行的免費(fèi)SQL數(shù)據(jù)庫(kù),在其網(wǎng)站上稱自己為“世界上最先進(jìn)的開源數(shù)據(jù)庫(kù)”。
/ PostgreSQL的優(yōu)點(diǎn) /
PostgreSQL是功能強(qiáng)大的軟件,已經(jīng)連續(xù)開發(fā)了30多年。很多人使用它,并且它有一個(gè)充滿活力的社區(qū)。
它與平臺(tái)無關(guān)。對(duì)于使用AWS的用戶,可以使用Amazon Relational Database Service(RDS)上的Amazon Aurora托管它。
另外,PostgreSQL正在迅速發(fā)展。它的性能優(yōu)于MySQL,MySQL已經(jīng)比MongoDB快得多。
/ PostgreSQL的缺點(diǎn) /
使用SQL本質(zhì)上增加了任何項(xiàng)目的復(fù)雜性,它是團(tuán)隊(duì)每天使用的一種全新的編程語言。
從NoSQL遷移到SQL可能很困難。從根本上說,它們是一種不同類型的數(shù)據(jù)庫(kù)結(jié)構(gòu)。NoSQL是具有鍵值對(duì)的文檔存儲(chǔ),而SQL由表和行組成。
其中一個(gè)選項(xiàng),也是The Guardian在遷移中使用的,是PostgreSQL中的JSONb列類型。然而,使用JSON blobs感覺有點(diǎn)像黑客,就像把NoSQL數(shù)據(jù)庫(kù)塞進(jìn)了SQL格式。
MongoDB替代方案3:DynamoDB
DynamoDB是亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)的NoSQL產(chǎn)品。MongoDB和DynamoDB都可以存儲(chǔ)類似JSON的數(shù)據(jù),具有任意的模式。
DynamoDB最近增加了一個(gè)名為rest加密的特性,現(xiàn)在它仍然是一個(gè)NoSQL數(shù)據(jù)庫(kù),與MongoDB競(jìng)爭(zhēng)非常激烈。
這意味著從MongoDB遷移到DynamoDB確實(shí)非常容易。
/ DynamoDB的優(yōu)點(diǎn) /
DynamoDB是AWS上的旗艦NoSQL數(shù)據(jù)庫(kù),所以它的先天優(yōu)勢(shì)是AWS平臺(tái)的成本、速度和可靠性。
作為AWS產(chǎn)品,它可以輕松地與AWS Lambda和API Gateway集成。
對(duì)于目前使用Mongo的人來說,DynamoDB的最大優(yōu)勢(shì)就是用戶可以直接從MongoDB進(jìn)行實(shí)時(shí)遷移到DynamoDB。
最好的部分是沒有可管理的基礎(chǔ)架構(gòu)——Amazon負(fù)責(zé)管理。
/ DynamoDB的缺點(diǎn) /
如果我認(rèn)為NoSQL丟失記錄的可能性太大,那么DynamoDB對(duì)我來說不是一個(gè)好選擇。
DynamoDB可能存在可擴(kuò)展性問題,比如那些與所謂的hotkeys相關(guān)的問題,這些記錄的評(píng)估頻率遠(yuǎn)遠(yuǎn)高于其他記錄。
此外,與MongoDB相比,DynamoDB支持較少?gòu)?fù)雜的數(shù)據(jù)類型,并且是AWS專有的產(chǎn)品。
/ DynamoDB不是MongoDB /
Samantha Atkins和Fredrik Erasmus等有益的讀者花時(shí)間對(duì)本文進(jìn)行了回復(fù),并提出了DynamoDB的其他缺點(diǎn)。
- 用DynamoDB做索引是很困難的,沒有全表掃描就沒有一般的查詢支持。
- DynamoDB使得很難從集合中檢索甚至簡(jiǎn)單的文檔計(jì)數(shù),并且它不使用游標(biāo)。
- DynamoDB的熱鍵和熱分區(qū)需要專業(yè)技術(shù)才能有效使用。
- 使用AWS上的DynamoDB,你必須用RCU(讀容量單位)和WCU(寫容量單位)來指定“吞吐量容量”,這給你的項(xiàng)目增加了很大的復(fù)雜性。
DynamoDB被稱為“我曾經(jīng)使用過的最不友好的持久化解決方案”。事實(shí)上,MongoDB自己的廣告文案列出了MongoDB相對(duì)于DynamoDB的十幾項(xiàng)優(yōu)勢(shì)。
所以,在從MongoDB切換到DynamoDB之前,一定要三思而后行,盡管兩者之間有明顯的相似之處。
我的看法
JAM Stack是當(dāng)今最酷的技術(shù)之一。它的速度快得離譜,易于訪問,對(duì)SEO也很友好,另外靜態(tài)文件在AWS上是免費(fèi)托管的。
然而,JAM Stack只有對(duì)于那些有能力有一個(gè)構(gòu)建步驟并重新編譯每一個(gè)變化的應(yīng)用程序才是正確的選擇。
如果你問我,我會(huì)說,即使是非常大的網(wǎng)站也可以通過預(yù)定的編譯,比如說每小時(shí)一次,在JAM Stack上構(gòu)建。JAM Stack很激進(jìn)。
它可能不適用于新聞?wù)军c(diǎn),但是許多動(dòng)態(tài)站點(diǎn)不需要比這更頻繁地更新內(nèi)容,靜態(tài)站點(diǎn)當(dāng)然也不需要。
SQL vs. NoSQL
如果說需要編譯步驟是一個(gè)項(xiàng)目的決定性因素,那么就會(huì)歸結(jié)為SQL與NoSQL:PostgreSQL或DynamoDB。
PostgreSQL不一定要托管在Amazon上,不過可以托管在Amazon RDS上。DynamoDB是由亞馬遜開發(fā)的,是亞馬遜的獨(dú)家產(chǎn)品。
SQL數(shù)據(jù)庫(kù)本身功能更強(qiáng)大,但也更復(fù)雜。它們的優(yōu)勢(shì)在于業(yè)務(wù)分析和搜索。
NoSQL數(shù)據(jù)庫(kù)更容易設(shè)置,對(duì)很多項(xiàng)目來說足夠了。這也是為什么The Guardian考慮用DynamoDB來寫他們的230萬篇文章。
最終,他們選擇了PostgreSQL,因?yàn)镈ynamoDB在2017年的時(shí)候并沒有提供加密功能,但如果他們今天考慮從MongoDB轉(zhuǎn)移到PostgreSQL,他們很可能會(huì)做出不同的決定。
總結(jié)
JAM Stack(無服務(wù)器架構(gòu))是一個(gè)很好的選擇,特別是對(duì)于任何一個(gè)以靜態(tài)為主的網(wǎng)站,也是一個(gè)很好的技術(shù),需要注意。
PostgreSQL擁有一個(gè)龐大的社區(qū),并在一個(gè)可靠的、功能豐富的、性能卓越的開源軟件包中提供了SQL的所有功能。
DynamoDB是MongoDB的即插即用的替代產(chǎn)品,它為你提供了規(guī)模、安全性和速度,而無需維護(hù)任何基礎(chǔ)設(shè)施。