自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別扯什么 CQRS,服務(wù)做什么讀寫分離,就離譜!

開發(fā) 架構(gòu)
互聯(lián)網(wǎng)微服務(wù)架構(gòu),應(yīng)該按照“子業(yè)務(wù)”進(jìn)行微服務(wù)拆分,而不應(yīng)該按照“讀寫”來進(jìn)行微服務(wù)拆分。

有朋友問我說:服務(wù)要不要做讀寫分離?

我的態(tài)度旗幟鮮明:不要。

畫外音:別扯什么CQRS。

什么是“服務(wù)讀寫分離”架構(gòu)?

有兩類最常見的。

第一類、單純服務(wù)讀寫分離

如上圖,服務(wù)化之后:

  • 同一個(gè)基礎(chǔ)服務(wù),分為讀服務(wù)與寫服務(wù);
  • 底層公用高可用的數(shù)據(jù)庫(kù)集群;

第二類、服務(wù)和數(shù)據(jù)庫(kù)同時(shí)讀寫分離

讀服務(wù)與寫服務(wù)讀寫的是不同的數(shù)據(jù)庫(kù),如上圖:

  • 寫服務(wù)訪問寫庫(kù);
  • 讀服務(wù)訪問讀庫(kù);
  • 寫庫(kù)與讀庫(kù)是一個(gè)主從同步的集群;

為什么我旗幟鮮明的反對(duì)服務(wù)區(qū)分讀寫分離?

原因1:上游容易困惑,運(yùn)維更加復(fù)雜。

  • 調(diào)用方對(duì)同一個(gè)基礎(chǔ)服務(wù),某一個(gè)RPC接口,在讀服務(wù),還是寫服務(wù),容易困惑;
  • 對(duì)于同一個(gè)基礎(chǔ)服務(wù),服務(wù)數(shù)量翻倍了,運(yùn)維更加復(fù)雜;

原因2:微服務(wù)不是這么拆分集群的。

  • 一般來說,垂直拆分,是按照“子業(yè)務(wù)”維度進(jìn)行拆分,而不是按照“讀寫”維度進(jìn)行拆分,這是模塊化設(shè)計(jì)的基本準(zhǔn)則;
  • 完全打破了“服務(wù)化數(shù)據(jù)庫(kù)私有”的微服務(wù)初衷;

兩個(gè)服務(wù)因?yàn)橥环輸?shù)據(jù)庫(kù)資源訪問而耦合在一起,當(dāng)數(shù)據(jù)庫(kù)資源發(fā)生變化的時(shí)候(例如:ip變化,域名變化,表結(jié)構(gòu)變化,水平切分變化等),有兩個(gè)依賴點(diǎn)需要修改。

而好的設(shè)計(jì),有變化產(chǎn)生時(shí),只有一個(gè)需要修改(低耦合,高內(nèi)聚)。

原因3:根本沒法很好的添加緩存。

大部分互聯(lián)網(wǎng)業(yè)務(wù)是讀多寫少的業(yè)務(wù),數(shù)據(jù)庫(kù)讀取最容易成為瓶頸,常見提升讀性能的方式是,增加緩存。

服務(wù)讀寫分離,怎么添加緩存?

如上圖,讀服務(wù)的下游增加一個(gè)緩存,當(dāng)有讀請(qǐng)求訪問時(shí):

  • 先訪問緩存,如果命中,直接返回;
  • 如果緩存不命中,訪問數(shù)據(jù)庫(kù),然后將數(shù)據(jù)放入緩存中,以便下一次能夠命中;

初步看,沒有問題。但是,寫服務(wù)修改數(shù)據(jù)庫(kù)時(shí),緩存中的數(shù)據(jù)沒有辦法得到淘汰!

有朋友說,寫數(shù)據(jù)庫(kù)之前,可以由寫服務(wù)來淘汰緩存:

即,讀服務(wù)與寫服務(wù)都可以操作緩存。

這個(gè)設(shè)計(jì),又違背了“服務(wù)化緩存私有”的微服務(wù)初衷,兩個(gè)服務(wù)因?yàn)橥环菥彺尜Y源訪問而耦合在一起,當(dāng)緩存資源發(fā)生變化的時(shí)候,有兩個(gè)依賴點(diǎn)需要修改。

況且,如果真的兩個(gè)服務(wù)訪問相同的數(shù)據(jù)庫(kù)和緩存,為什么不合成一個(gè)服務(wù)呢?

硬要拆成兩個(gè)服務(wù),不是自己玩自己么?

另外,有朋友說,可以由寫服務(wù)發(fā)消息來淘汰緩存:

如上圖:

  • 緩存私有,只有讀服務(wù)操縱緩存;
  • 數(shù)據(jù)庫(kù)發(fā)生寫請(qǐng)求時(shí),寫服務(wù)給MQ發(fā)消息,由讀服務(wù)來淘汰緩存;

這種設(shè)計(jì):

  • 讀服務(wù)來淘汰緩存,本質(zhì)是一個(gè)寫請(qǐng)求,不是很奇怪么?
  • 引入了一個(gè)MQ組件,引入更大的一致性風(fēng)險(xiǎn)
  • 讀服務(wù)和寫服務(wù)如果是一個(gè)進(jìn)程,豈不是更好么,干嘛硬要跨進(jìn)程通信呢?

所以,還是一個(gè)服務(wù)更好:

  • 調(diào)用方無二義性,不糾結(jié);
  • 好維護(hù);
  • 數(shù)據(jù)庫(kù),緩存私有,無耦合;

稍作總結(jié):互聯(lián)網(wǎng)微服務(wù)架構(gòu),應(yīng)該按照“子業(yè)務(wù)”進(jìn)行微服務(wù)拆分,而不應(yīng)該按照“讀寫”來進(jìn)行微服務(wù)拆分。

以上僅為個(gè)人架構(gòu)經(jīng)驗(yàn),供大伙參考,歡迎共同探討。

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2013-09-23 10:36:17

Hadoop大數(shù)據(jù)

2018-10-16 16:45:05

數(shù)據(jù)庫(kù)讀寫分離

2015-04-28 15:03:20

大數(shù)據(jù)中小企業(yè)的痛

2014-09-24 09:40:16

大數(shù)據(jù)

2024-12-27 15:28:01

CQRS架構(gòu)方式

2017-09-01 10:48:33

分離CQRS性能

2018-01-01 05:23:13

服務(wù)化讀寫分離架構(gòu)

2016-09-14 16:31:17

QPS系統(tǒng)

2017-12-26 16:18:00

架構(gòu)服務(wù)化讀寫分離

2020-09-07 19:45:37

Linux顯示服務(wù)器黑話解釋

2018-01-15 05:54:45

數(shù)據(jù)庫(kù)讀寫分離互聯(lián)網(wǎng)

2018-01-09 18:46:44

數(shù)據(jù)庫(kù)架構(gòu)讀寫分離

2021-02-02 09:37:20

CQRS系統(tǒng)數(shù)據(jù)庫(kù)

2013-01-06 15:31:08

精益原則

2023-09-11 08:30:30

Creator工廠方法

2009-07-16 11:13:50

Java Swing

2011-10-13 14:26:12

Qt WebKitWebKit

2017-08-24 10:00:05

SDWANGoogle網(wǎng)絡(luò)

2023-11-10 15:05:08

Kubernetes云計(jì)算

2019-09-15 19:11:14

CPU操作系統(tǒng)空閑
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)