也有可能的是,我們可以設(shè)計(jì)一個(gè)服務(wù),這個(gè)服務(wù)需要多種數(shù)據(jù)庫支撐。例如,我們可以創(chuàng)建一個(gè)使用鍵值存儲模式作為索引的酒店服務(wù),在酒店名稱和ID之間實(shí)現(xiàn)映射,而存將關(guān)于酒店的描述性數(shù)據(jù)存儲在Cassandra中。
注意,名稱映射到ID可以在Cassandra中采用規(guī)范化的設(shè)計(jì)方法去實(shí)現(xiàn),其中一個(gè)單獨(dú)表去維護(hù)名稱至ID的映射關(guān)系。這使用了更多的存儲空間,但降低了管理單獨(dú)鍵值存儲的操作復(fù)雜性。
這是我推薦的做法-?針對某個(gè)微服務(wù),只要可行,就應(yīng)該堅(jiān)持使用單一數(shù)據(jù)模型(數(shù)據(jù)庫)。如果你發(fā)現(xiàn)一種情況,認(rèn)為單個(gè)服務(wù)需要兩個(gè)不同數(shù)據(jù)庫支撐,那么請考慮該服務(wù)的粒度是否可能變得太大。你可能需要考慮將該服務(wù)拆分為較小的服務(wù)。
混合持久化局限性的權(quán)衡
混合持久化的主要缺點(diǎn)在于支持多種技術(shù)的成本,無論是在最初的開發(fā)階段和將來的運(yùn)營方面。
主要的開發(fā)成本,是在需要培訓(xùn)每個(gè)開發(fā)人員去掌握每個(gè)新的數(shù)據(jù)庫技術(shù)。這是非常重要的,尤其是在開發(fā)人員頻繁流動團(tuán)隊(duì)中。
另一個(gè)成本是支持多個(gè)數(shù)據(jù)庫的操作成本。這會成為一個(gè)問題,尤其是當(dāng)數(shù)據(jù)庫是集中管理,并且團(tuán)隊(duì)必須在多種技術(shù)的掌握上維持高水平,但這在DevOps環(huán)境下,該問題并不會太突出,因?yàn)殚_發(fā)團(tuán)隊(duì)需要支持他們在生產(chǎn)環(huán)境中選擇的數(shù)據(jù)庫。
多模型數(shù)據(jù)庫(Multi Model Databases)
作為另外的選擇方案或混合持久化模式的補(bǔ)充, 數(shù)據(jù)庫廠商已經(jīng)開始建立和推廣多模型的數(shù)據(jù)庫。術(shù)語“模型”指的是數(shù)據(jù)存儲所提供的核心抽象,如表(關(guān)系和非關(guān)系)、列存儲、鍵值、文檔或圖。我們可以將一個(gè)多模型應(yīng)用程序看作一個(gè)使用多個(gè)數(shù)據(jù)存儲類型的應(yīng)用程序,而多模型數(shù)據(jù)庫是支持多個(gè)抽象模型的數(shù)據(jù)庫。
DataStax企業(yè)版(DSE)是多模型數(shù)據(jù)庫的典型例子,它核心支持Cassandra的分區(qū)行存儲(表格)模型,同時(shí)也支持基于在其之上的圖的抽象層(DSE圖)。DSE在核心模型之上構(gòu)建對應(yīng)的鍵值和文檔模型也是很簡單的,如下圖所示。這樣,我們可以修改上面的混合持久化的方法,從而利用一個(gè)基礎(chǔ)數(shù)據(jù)庫引擎為我們所有的服務(wù)提供對應(yīng)的服務(wù),而使用單獨(dú)的Cassandra keyspaces在不同服務(wù)擁有的數(shù)據(jù)間維護(hù)清晰的邊界。
下面是它能實(shí)現(xiàn)的功能:
表格:我們主要的應(yīng)用服務(wù)A可以通過Cassandra的查詢語言(CQL)直接和DSE的數(shù)據(jù)庫打交道。
鍵值對:雖然Apache和Cassandra的分布式版本DataStax都沒有提供明確的鍵值對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需要針對表定義schema模式,所以不能插入新增任意的JSON列,這是一個(gè)可能通常和文檔型數(shù)據(jù)庫有關(guān)的特性。
圖:對于象服務(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。
多模型數(shù)據(jù)庫的優(yōu)點(diǎn)和限制
在考慮是否投資使用多模型數(shù)據(jù)庫(或你已經(jīng)在使用的數(shù)據(jù)庫的多模型的特性)時(shí),你要考慮我們前文討論的關(guān)于混合持久化中,同樣的開發(fā)和運(yùn)營成本的問題。
使用多模型數(shù)據(jù)庫可以讓運(yùn)營變得簡單。即使不同的開發(fā)團(tuán)隊(duì)使用不同的API和不同的交互模式和后端數(shù)據(jù)庫平臺打交道,我們也只需要管理一個(gè)平臺而已,從而提高了效率。
在選擇多模型數(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ù)集,相比之下我們長期喜愛的Neo4j開始表現(xiàn)出一定的局限性。這是需要取舍的;比如,你會失去了ACID的事務(wù)特性和Neo4j運(yùn)行時(shí)的模式自由的特性,但卻可以訪問Cassandra的基礎(chǔ)表,以及針對分析工作負(fù)載和Spark的整合,還有強(qiáng)大的TinkerPop/Gremlin查詢語言可以使用,這的確是一個(gè)值得考慮的選擇。
如果考慮Web應(yīng)用中的各種數(shù)據(jù)類型,你可能會發(fā)現(xiàn)不同的數(shù)據(jù)類型對一致性有不同的需求,而且實(shí)際需要立即一致性的數(shù)據(jù)類型數(shù)量相對較少。
上面引用的ThoughtWorks的觀點(diǎn)中,還提到了在考慮多模型數(shù)據(jù)庫中另一個(gè)重要的因素?-?在不同的模型和數(shù)據(jù)引擎間的整合和交互問題,以及為訪問數(shù)據(jù)的各種操作和分析的用例。DSE支持通過Spark(DSE分析)訪問圖數(shù)據(jù)以進(jìn)行數(shù)據(jù)分析,并且DSE搜索引擎提供了針對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、 識別你的應(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)建分層的鍵值對和文檔數(shù)據(jù)模型。請務(wù)必考慮在操作和分析用例中訪問數(shù)據(jù)的各種方法,以便提前計(jì)劃如何將搜索索引和復(fù)制等特性用于數(shù)據(jù)分析中心。
3、用圖的方法去表示(即DSE圖)高度關(guān)聯(lián)的數(shù)據(jù),特別是在實(shí)體之間的關(guān)系有多個(gè)或多個(gè)屬性,并且數(shù)量比實(shí)體自己的屬性多的時(shí)候,或者需要在相同的實(shí)體之間捕捉多對多的關(guān)系的時(shí)候。
4、在不需要變更的情況下,保留關(guān)系數(shù)據(jù)庫技術(shù)中的遺留投資。例如,當(dāng)你的案例是需要大規(guī)模、低延遲和高可用性的時(shí)候,那就使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫吧。
我希望本文為讀者提供了一個(gè)有用的框架,來考慮在應(yīng)用程序中如何和怎么樣去支持多數(shù)據(jù)模型,以及何時(shí)考慮使用多模型數(shù)據(jù)庫。
評論
查看更多