微服務(wù)數(shù)據(jù)存儲(chǔ)模式

翻譯自
https://microservices.io/patterns/data/database-per-service.html

寫在前面

公司采用微服務(wù)模式重構(gòu)了產(chǎn)品線模叙,但是在微服務(wù)化過程中遇到一些問題,例如:
1.分布式事務(wù);
2.基礎(chǔ)數(shù)據(jù)共享彭则;
3.跨庫關(guān)聯(lián)查詢夸盟;
4.單個(gè)服務(wù)部署集群遇到的問題糕篇,像緩存一致性绳矩、定時(shí)任務(wù)單點(diǎn)處理平项、請(qǐng)求負(fù)載均衡危虱、topic消息消費(fèi)等榨了;

針對(duì)基礎(chǔ)數(shù)據(jù)共享拐云,筆者開發(fā)了一個(gè)數(shù)據(jù)同步j(luò)ar包已經(jīng)較好的解決了該問題,但是對(duì)于分布式事務(wù)和跨服務(wù)數(shù)據(jù)關(guān)聯(lián)依然存在很多疑惑。在查閱資料過程中痘儡,發(fā)現(xiàn)了https://microservices.io/
該博客,因此對(duì)其中部分內(nèi)容進(jìn)行摘錄和解讀猜极。

Pattern: Database per service

Context

Let’s imagine you are developing an online store application using the Microservice architecture pattern. Most services need to persist data in some kind of database. For example, the Order Service stores information about orders and the Customer Service stores information about customers.

image

Problem

What’s the database architecture in a microservices application?

Forces

  • Services must be loosely coupled so that they can be developed, deployed and scaled independently

  • Some business transactions must enforce invariants that span multiple services. For example, the Place Order use case must verify that a new Order will not exceed the customer’s credit limit. Other business transactions, must update data owned by multiple services.

  • Some business transactions need to query data that is owned by multiple services. For example, the View Available Credit use must query the Customer to find the creditLimit and Orders to calculate the total amount of the open orders.

  • Some queries must join data that is owned by multiple services. For example, finding customers in a particular region and their recent orders requires a join between customers and orders.

  • Databases must sometimes be replicated and sharded in order to scale. See the Scale Cube.

  • Different services have different data storage requirements. For some services, a relational database is the best choice. Other services might need a NoSQL database such as MongoDB, which is good at storing complex, unstructured data, or Neo4J, which is designed to efficiently store and query graph data.

Solution

Keep each microservice’s persistent data private to that service and accessible only via its API. A service’s transactions only involve its database.

The following diagram shows the structure of this pattern.

image

The service’s database is effectively part of the implementation of that service. It cannot be accessed directly by other services.

There are a few different ways to keep a service’s persistent data private. You do not need to provision a database server for each service. For example, if you are using a relational database then the options are:

  • Private-tables-per-service – each service owns a set of tables that must only be accessed by that service
  • Schema-per-service – each service has a database schema that’s private to that service
  • Database-server-per-service – each service has it’s own database server.

Private-tables-per-service and schema-per-service have the lowest overhead. Using a schema per service is appealing since it makes ownership clearer. Some high throughput services might need their own database server.

It is a good idea to create barriers that enforce this modularity. You could, for example, assign a different database user id to each service and use a database access control mechanism such as grants. Without some kind of barrier to enforce encapsulation, developers will always be tempted to bypass a service’s API and access it’s data directly.

Example

The FTGO application is an example of an application that uses this approach. Each service has database credentials that only grant it access its own (logical) database on a shared MySQL server. For more information, see this blog post.

Resulting context

每個(gè)服務(wù)使用獨(dú)立的數(shù)據(jù)持久化有以下優(yōu)點(diǎn):
1.松耦合缨叫,改變一個(gè)服務(wù)的數(shù)據(jù)庫不影響其他服務(wù)
2.每個(gè)服務(wù)可以使用最合適的數(shù)據(jù)庫類型,例如es剪勿,mongo等

Using a database per service has the following benefits:

  • Helps ensure that the services are loosely coupled. Changes to one service’s database does not impact any other services.

  • Each service can use the type of database that is best suited to its needs. For example, a service that does text searches could use ElasticSearch. A service that manipulates a social graph could use Neo4j.

也會(huì)有下面的缺點(diǎn)
1.分布式事務(wù)
2.跨庫聯(lián)查(join)
3.管理多種不同數(shù)據(jù)庫是一個(gè)麻煩事

Using a database per service has the following drawbacks:

  • Implementing business transactions that span multiple services is not straightforward. Distributed transactions are best avoided because of the CAP theorem. Moreover, many modern (NoSQL) databases don’t support them.

  • Implementing queries that join data that is now in multiple databases is challenging.

  • Complexity of managing multiple SQL and NoSQL databases

There are various patterns/solutions for implementing transactions and queries that span services:

  • Implementing transactions that span services - use the Saga pattern.

  • Implementing queries that span services:

    • API Composition - the application performs the join rather than the database. For example, a service (or the API gateway) could retrieve a customer and their orders by first retrieving the customer from the customer service and then querying the order service to return the customer’s most recent orders.

    • Command Query Responsibility Segregation (CQRS) - maintain one or more materialized views that contain data from multiple services. The views are kept by services that subscribe to events that each services publishes when it updates its data. For example, the online store could implement a query that finds customers in a particular region and their recent orders by maintaining a view that joins customers and orders. The view is updated by a service that subscribes to customer and order events.

Related patterns

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贸诚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酱固,老刑警劉巖械念,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異运悲,居然都是意外死亡龄减,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門扇苞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺殿,“玉大人,你說我怎么就攤上這事鳖敷〔彼眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵定踱,是天一觀的道長(zhǎng)棍潘。 經(jīng)常有香客問我,道長(zhǎng)崖媚,這世上最難降的妖魔是什么亦歉? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮畅哑,結(jié)果婚禮上肴楷,老公的妹妹穿的比我還像新娘。我一直安慰自己荠呐,他們只是感情好赛蔫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泥张,像睡著了一般呵恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媚创,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天渗钉,我揣著相機(jī)與錄音,去河邊找鬼钞钙。 笑死鳄橘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芒炼。 我是一名探鬼主播瘫怜,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼焕议!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤盅安,失蹤者是張志新(化名)和其女友劉穎唤锉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體别瞭,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窿祥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝙寨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晒衩。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墙歪,靈堂內(nèi)的尸體忽然破棺而出听系,到底是詐尸還是另有隱情,我是刑警寧澤虹菲,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布靠胜,位于F島的核電站,受9級(jí)特大地震影響毕源,放射性物質(zhì)發(fā)生泄漏浪漠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一霎褐、第九天 我趴在偏房一處隱蔽的房頂上張望址愿。 院中可真熱鬧,春花似錦冻璃、人聲如沸响谓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歌粥。三九已至,卻和暖如春拍埠,著一層夾襖步出監(jiān)牢的瞬間失驶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工枣购, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嬉探,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓棉圈,卻偏偏與公主長(zhǎng)得像涩堤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子分瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348