溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么為微服務(wù)選擇數(shù)據(jù)庫

發(fā)布時(shí)間:2021-11-09 09:13:52 來源:億速云 閱讀:126 作者:小新 欄目:數(shù)據(jù)庫

這篇文章主要介紹了怎么為微服務(wù)選擇數(shù)據(jù)庫,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

你的微服務(wù)架構(gòu)需要多種數(shù)據(jù)模型。你是應(yīng)該選擇混合持久化呢還是多模型數(shù)據(jù)庫?

怎么為微服務(wù)選擇數(shù)據(jù)庫

在過去的十年,大規(guī)模的分布式系統(tǒng)呈現(xiàn)爆炸式增長(zhǎng)。這一趨勢(shì)促使在數(shù)據(jù)庫領(lǐng)域產(chǎn)生了一股巨大的創(chuàng)造力,這在軟件業(yè)的歷史上無疑是沒有先例的。其結(jié)果是誕生了一個(gè)健康和充滿競(jìng)爭(zhēng)的數(shù)據(jù)庫市場(chǎng),我們可以因此在大量的平臺(tái)中各取所需。但是我們應(yīng)該如何抉擇?

在本文中,我們將探討如何為根據(jù)應(yīng)用程序去選擇核實(shí)的數(shù)據(jù)庫模式。(是的,可以有一個(gè)以上的選擇!),我們也會(huì)看看對(duì)數(shù)據(jù)模式的選擇可以幫助確定在數(shù)據(jù)層中將選用哪些技術(shù)。

云架構(gòu),NoSQL 和微服務(wù)架構(gòu)

隨著開發(fā)人員開始創(chuàng)建可擴(kuò)展的Web應(yīng)用,歷史上在數(shù)據(jù)架構(gòu)上占主導(dǎo)地位的關(guān)系型數(shù)據(jù)庫,開始顯示出很大的壓力。我們開發(fā)了非常流行的社交應(yīng)用,并開始將越來越多的設(shè)備連接到物聯(lián)網(wǎng)(IoT)。用戶大量的讀取和寫入數(shù)據(jù)導(dǎo)致了必須擴(kuò)展數(shù)據(jù)層,從而出現(xiàn)了新型的數(shù)據(jù)庫來滿足這些高可擴(kuò)展性需求。

在許多情況下,這些新的數(shù)據(jù)庫“NoSQL”或“非關(guān)系”的解決方案,所基于的數(shù)據(jù)模型和傳統(tǒng)的關(guān)系數(shù)據(jù)庫模型不同。NoSQL數(shù)據(jù)庫包括有文檔型、鍵值對(duì)型(key-value)、列式數(shù)據(jù)庫甚至圖數(shù)據(jù)庫。通常來說,這些數(shù)據(jù)庫犧牲了一些關(guān)系數(shù)據(jù)庫的常見的的特性,如強(qiáng)一致性、ACID事務(wù)特性和join連接。

與此同時(shí),和數(shù)據(jù)庫技術(shù)的變革一樣,在本世紀(jì)初的SOA(面向服務(wù)的架構(gòu)),正逐漸演變?yōu)槲⒎?wù)架構(gòu)的體系架構(gòu),許多企業(yè)也開始逐漸拋棄重量級(jí)的SOA體系架構(gòu)如企業(yè)服務(wù)總線(ESB),并傾向使用“去中心化”的架構(gòu)方法。微服務(wù)架構(gòu)的魅力在于其開發(fā)、管理和擴(kuò)展服務(wù)都是相對(duì)獨(dú)立的。這給了我們很多在實(shí)施方面的靈活性,包括基礎(chǔ)架構(gòu)技術(shù),如數(shù)據(jù)庫。

舉個(gè)例子,我們假設(shè)正在為微服務(wù)架構(gòu)做開發(fā)工作,并期待著大規(guī)模的可擴(kuò)展性的需求。無論這個(gè)項(xiàng)目是一個(gè)新的應(yīng)用還是對(duì)現(xiàn)有應(yīng)用的重構(gòu),我們都有機(jī)會(huì)針對(duì)數(shù)據(jù)庫做出新的選擇。

混合持久化(Polyglot persistence)

微服務(wù)架構(gòu)風(fēng)格的一個(gè)關(guān)鍵的好處,是持久性的封裝。我們可以根據(jù)每個(gè)服務(wù)的需要,去選擇不同的持久化技術(shù)。根據(jù)每種數(shù)據(jù)類型的特點(diǎn)而去選擇數(shù)據(jù)存儲(chǔ)的方法,被稱為混合持久化,這一術(shù)語起初是由Martin  Fowler等人推廣起來的?;旌铣志没臀⒎?wù)架構(gòu)可謂是天作之合。

下圖中,展示了一系列的微服務(wù),以及我們?nèi)绾螢槊總€(gè)服務(wù)選擇不同的數(shù)據(jù)模式。我不想在本文中,為每種類型的數(shù)據(jù)庫去選擇合適的用例。我的意圖是要突出各類型數(shù)據(jù)庫的優(yōu)勢(shì),以及為什么混合持久化的方法是值得稱道的.

怎么為微服務(wù)選擇數(shù)據(jù)庫

其中,開發(fā)服務(wù)A的團(tuán)隊(duì),因?yàn)樵摲?wù)是基于大規(guī)模數(shù)據(jù)管理的核心應(yīng)用,可能使用如Apache  Cassandra這樣的表格模型數(shù)據(jù)庫。例如,一個(gè)零售應(yīng)用庫存應(yīng)用,可能很適合使用Apache  Cassandra。Cassandra提供了一系列協(xié)調(diào)機(jī)制工具,如可調(diào)一致,批處理和輕量級(jí)的事務(wù)機(jī)制,可以作為完整ACID事務(wù)機(jī)制的替代。

服務(wù)B支持用眾所周知的關(guān)鍵字查找值的方式,例如針對(duì)產(chǎn)品目錄的描述性數(shù)據(jù)。對(duì)于鍵值存儲(chǔ)模型來說,這是一個(gè)很好的例子,在這里,我們通過一個(gè)眾所周知的鍵值(如產(chǎn)品ID)查找一系列的數(shù)據(jù)。很多內(nèi)存緩存都使用鍵值對(duì)數(shù)據(jù)模式去支持大規(guī)模的快速讀取。

服務(wù)C可能主要關(guān)注半結(jié)構(gòu)化內(nèi)容,例如Web站點(diǎn)的表單或頁面,而文檔存儲(chǔ)可能非常適合該類型數(shù)據(jù)。文檔存儲(chǔ)與鍵值存儲(chǔ)有許多相似之處,但是一個(gè)關(guān)鍵的區(qū)別是文檔型數(shù)據(jù)支持?jǐn)?shù)據(jù)上增加結(jié)構(gòu),例如對(duì)特定屬性進(jìn)行索引以支持快速檢索。

服務(wù)D可能涉及數(shù)據(jù)之間的復(fù)雜關(guān)系導(dǎo)航,例如客戶數(shù)據(jù)和與組織中各部門的客戶聯(lián)系歷史數(shù)據(jù)。這可能涉及其他服務(wù)所擁有的數(shù)據(jù)類型之間的關(guān)系。這是一個(gè)有趣的案例,因?yàn)樗_始與上面提到的服務(wù)有各自的數(shù)據(jù)類型的約束相反。在這種情況下,你可以選擇為你的服務(wù)創(chuàng)建一個(gè)具有對(duì)底層表的只讀訪問的圖,然后通過這個(gè)“前門”處理所有的變化——即通過這個(gè)“前門”去調(diào)用那些“擁有”這些數(shù)據(jù)類型的其他服務(wù)的API。

***,我們可能還有一個(gè)使用關(guān)系數(shù)據(jù)庫技術(shù)的遺留系統(tǒng)或服務(wù),或者我們有一個(gè)服務(wù)來管理那些數(shù)據(jù)量較少,或者不經(jīng)常變更的數(shù)據(jù)。關(guān)系數(shù)據(jù)庫可能完全適合于這些場(chǎng)景。

單個(gè)服務(wù)是否應(yīng)該使用混合持久化?

也有可能的是,我們可以設(shè)計(jì)一個(gè)服務(wù),這個(gè)服務(wù)需要多種數(shù)據(jù)庫支撐。例如,我們可以創(chuàng)建一個(gè)使用鍵值存儲(chǔ)模式作為索引的酒店服務(wù),在酒店名稱和ID之間實(shí)現(xiàn)映射,而存將關(guān)于酒店的描述性數(shù)據(jù)存儲(chǔ)在Cassandra中。

怎么為微服務(wù)選擇數(shù)據(jù)庫

注意,名稱映射到ID可以在Cassandra中采用規(guī)范化的設(shè)計(jì)方法去實(shí)現(xiàn),其中一個(gè)單獨(dú)表去維護(hù)名稱至ID的映射關(guān)系。這使用了更多的存儲(chǔ)空間,但降低了管理單獨(dú)鍵值存儲(chǔ)的操作復(fù)雜性。

這是我推薦的做法-?針對(duì)某個(gè)微服務(wù),只要可行,就應(yīng)該堅(jiān)持使用單一數(shù)據(jù)模型(數(shù)據(jù)庫)。如果你發(fā)現(xiàn)一種情況,認(rèn)為單個(gè)服務(wù)需要兩個(gè)不同數(shù)據(jù)庫支撐,那么請(qǐng)考慮該服務(wù)的粒度是否可能變得太大。你可能需要考慮將該服務(wù)拆分為較小的服務(wù)。

混合持久化局限性的權(quán)衡

混合持久化的主要缺點(diǎn)在于支持多種技術(shù)的成本,無論是在最初的開發(fā)階段和將來的運(yùn)營(yíng)方面。

主要的開發(fā)成本,是在需要培訓(xùn)每個(gè)開發(fā)人員去掌握每個(gè)新的數(shù)據(jù)庫技術(shù)。這是非常重要的,尤其是在開發(fā)人員頻繁流動(dòng)團(tuán)隊(duì)中。

另一個(gè)成本是支持多個(gè)數(shù)據(jù)庫的操作成本。這會(huì)成為一個(gè)問題,尤其是當(dāng)數(shù)據(jù)庫是集中管理,并且團(tuán)隊(duì)必須在多種技術(shù)的掌握上維持高水平,但這在DevOps環(huán)境下,該問題并不會(huì)太突出,因?yàn)殚_發(fā)團(tuán)隊(duì)需要支持他們?cè)谏a(chǎn)環(huán)境中選擇的數(shù)據(jù)庫。

多模型數(shù)據(jù)庫(Multi Model Databases)

作為另外的選擇方案或混合持久化模式的補(bǔ)充,  數(shù)據(jù)庫廠商已經(jīng)開始建立和推廣多模型的數(shù)據(jù)庫。術(shù)語“模型”指的是數(shù)據(jù)存儲(chǔ)所提供的核心抽象,如表(關(guān)系和非關(guān)系)、列存儲(chǔ)、鍵值、文檔或圖。我們可以將一個(gè)多模型應(yīng)用程序看作一個(gè)使用多個(gè)數(shù)據(jù)存儲(chǔ)類型的應(yīng)用程序,而多模型數(shù)據(jù)庫是支持多個(gè)抽象模型的數(shù)據(jù)庫。

DataStax企業(yè)版(DSE)是多模型數(shù)據(jù)庫的典型例子,它核心支持Cassandra的分區(qū)行存儲(chǔ)(表格)模型,同時(shí)也支持基于在其之上的圖的抽象層(DSE圖)。DSE在核心模型之上構(gòu)建對(duì)應(yīng)的鍵值和文檔模型也是很簡(jiǎn)單的,如下圖所示。這樣,我們可以修改上面的混合持久化的方法,從而利用一個(gè)基礎(chǔ)數(shù)據(jù)庫引擎為我們所有的服務(wù)提供對(duì)應(yīng)的服務(wù),而使用單獨(dú)的Cassandra  keyspaces在不同服務(wù)擁有的數(shù)據(jù)間維護(hù)清晰的邊界。

怎么為微服務(wù)選擇數(shù)據(jù)庫

下面是它能實(shí)現(xiàn)的功能:

[list]

  • 表格:我們主要的應(yīng)用服務(wù)A可以通過Cassandra的查詢語言(CQL)直接和DSE的數(shù)據(jù)庫打交道。

  • 鍵值對(duì):雖然Apache和Cassandra的分布式版本DataStax都沒有提供明確的鍵值對(duì)API,但是象服務(wù)B可以通過表設(shè)計(jì)去支持單個(gè)鍵值和列的方法,去訪問

Cassandra,例如:

代碼

CREATE TABLE hotel.hotels (key uuid PRIMARY KEY,value text); // 或者選擇blob類型
  • 文檔型:Cassandra通過使用JSON文件支持文檔型風(fēng)格的數(shù)據(jù),這可以用在服務(wù)C中。注意因?yàn)镃assandra需要針對(duì)表定義schema模式,所以不能插入新增任意的JSON列,這是一個(gè)可能通常和文檔型數(shù)據(jù)庫有關(guān)的特性。

  • 圖:對(duì)于象服務(wù)D那樣相關(guān)度很高的數(shù)據(jù),DSE的圖是一個(gè)高度可擴(kuò)展的圖形數(shù)據(jù)庫,它構(gòu)建于DSE數(shù)據(jù)庫之上。DSE圖支持來自Apache  tinkerpop項(xiàng)目中強(qiáng)大的功能和表現(xiàn)力的Gremlin API。[/list]

多模型數(shù)據(jù)庫的優(yōu)點(diǎn)和限制

在考慮是否投資使用多模型數(shù)據(jù)庫(或你已經(jīng)在使用的數(shù)據(jù)庫的多模型的特性)時(shí),你要考慮我們前文討論的關(guān)于混合持久化中,同樣的開發(fā)和運(yùn)營(yíng)成本的問題。

使用多模型數(shù)據(jù)庫可以讓運(yùn)營(yíng)變得簡(jiǎn)單。即使不同的開發(fā)團(tuán)隊(duì)使用不同的API和不同的交互模式和后端數(shù)據(jù)庫平臺(tái)打交道,我們也只需要管理一個(gè)平臺(tái)而已,從而提高了效率。

在選擇多模型數(shù)據(jù)庫時(shí)要考慮的一個(gè)問題是如何支持各種模型。一種常見的方法,是基于單一的原生的基礎(chǔ)模型的數(shù)據(jù)庫引擎,而其他模型都是構(gòu)建在其之上。分層數(shù)據(jù)模型更能展現(xiàn)底層基本模型的特性。

例如,ThoughtWorks技術(shù)雷達(dá)第16期中,討論了基于Cassandra構(gòu)建的DSE圖數(shù)據(jù)庫的特性,并且也提到其中需要權(quán)衡的內(nèi)容:

引用

基于Cassandra  構(gòu)建的DSE圖數(shù)據(jù)庫定位是大規(guī)模的數(shù)據(jù)集,相比之下我們長(zhǎng)期喜愛的Neo4j開始表現(xiàn)出一定的局限性。這是需要取舍的;比如,你會(huì)失去了ACID的事務(wù)特性和Neo4j運(yùn)行時(shí)的模式自由的特性,但卻可以訪問Cassandra的基礎(chǔ)表,以及針對(duì)分析工作負(fù)載和Spark的整合,還有強(qiáng)大的TinkerPop/Gremlin查詢語言可以使用,這的確是一個(gè)值得考慮的選擇。

如果考慮Web應(yīng)用中的各種數(shù)據(jù)類型,你可能會(huì)發(fā)現(xiàn)不同的數(shù)據(jù)類型對(duì)一致性有不同的需求,而且實(shí)際需要立即一致性的數(shù)據(jù)類型數(shù)量相對(duì)較少。

上面引用的ThoughtWorks的觀點(diǎn)中,還提到了在考慮多模型數(shù)據(jù)庫中另一個(gè)重要的因素?-?在不同的模型和數(shù)據(jù)引擎間的整合和交互問題,以及為訪問數(shù)據(jù)的各種操作和分析的用例。DSE支持通過Spark(DSE分析)訪問圖數(shù)據(jù)以進(jìn)行數(shù)據(jù)分析,并且DSE搜索引擎提供了針對(duì)DSE數(shù)據(jù)庫中的數(shù)據(jù)創(chuàng)建各種查詢索引的能力。

微服務(wù)數(shù)據(jù)模型操作的四個(gè)步驟

既然我們已經(jīng)探討混合持久化和多模型兩種方式的優(yōu)缺點(diǎn),我們應(yīng)該如何去決定哪些數(shù)據(jù)模型適用于大規(guī)??蓴U(kuò)展的微服務(wù)應(yīng)用呢?可以按照以下步驟:

  1. 識(shí)別你的應(yīng)用程序中主要的數(shù)據(jù)類型,為其中每種類型創(chuàng)建一個(gè)服務(wù),并讓每個(gè)服務(wù)掌控相應(yīng)的持久層。在可能的情況下,為所有服務(wù)都使用多模型數(shù)據(jù)庫,允許服務(wù)在與數(shù)據(jù)交互的模型中是不相同的。

  2. 用Tabular(例如DSE數(shù)據(jù)庫)作為網(wǎng)絡(luò)水平的可擴(kuò)展性和可用性的主要模型,然后根據(jù)需要在此之上構(gòu)建分層的鍵值對(duì)和文檔數(shù)據(jù)模型。請(qǐng)務(wù)必考慮在操作和分析用例中訪問數(shù)據(jù)的各種方法,以便提前計(jì)劃如何將搜索索引和復(fù)制等特性用于數(shù)據(jù)分析中心。

  3. 用圖的方法去表示(即DSE圖)高度關(guān)聯(lián)的數(shù)據(jù),特別是在實(shí)體之間的關(guān)系有多個(gè)或多個(gè)屬性,并且數(shù)量比實(shí)體自己的屬性多的時(shí)候,或者需要在相同的實(shí)體之間捕捉多對(duì)多的關(guān)系的時(shí)候。

  4. 在不需要變更的情況下,保留關(guān)系數(shù)據(jù)庫技術(shù)中的遺留投資。例如,當(dāng)你的案例是需要大規(guī)模、低延遲和高可用性的時(shí)候,那就使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫吧。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么為微服務(wù)選擇數(shù)據(jù)庫”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI