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

DB分庫分表(3):關(guān)于使用框架還是自主開發(fā)以及sharding實現(xiàn)層面的考量

數(shù)據(jù)庫
當(dāng)團隊對系統(tǒng)業(yè)務(wù)和數(shù)據(jù)庫進行了細致的梳理,確定了切分方案后,接下來的問題就是如何去實現(xiàn)切分方案了,目前在sharding方面有不少的開源框架和產(chǎn)品可供參考,同時很多團隊也會選擇自主開發(fā)實現(xiàn),而不管是選擇框架還是自主開發(fā),都會面臨一個在哪一層上實現(xiàn)sharding邏輯的問題,本文會對這一系列的問題逐一進行分析和考量。

當(dāng)團隊對系統(tǒng)業(yè)務(wù)和數(shù)據(jù)庫進行了細致的梳理,確定了切分方案后,接下來的問題就是如何去實現(xiàn)切分方案了,目前在sharding方面有不少的開源框架和產(chǎn)品可供參考,同時很多團隊也會選擇自主開發(fā)實現(xiàn),而不管是選擇框架還是自主開發(fā),都會面臨一個在哪一層上實現(xiàn)sharding邏輯的問題,本文會對這一系列的問題逐一進行分析和考量。

一、sharding邏輯的實現(xiàn)層面

從一個系統(tǒng)的程序架構(gòu)層面來看,sharding邏輯可以在DAO層、JDBC API層、介于DAO與JDBC之間的Spring數(shù)據(jù)訪問封裝層(各種spring的template)以及介于應(yīng)用服務(wù)器與數(shù)據(jù)庫之間的sharding代理服務(wù)器四個層面上實現(xiàn)。

 

 

圖1. Sharding實現(xiàn)層面與相關(guān)框架/產(chǎn)品

  • 在DAO層實現(xiàn)

當(dāng)團隊決定自行實現(xiàn)sharding的時候,DAO層可能是嵌入sharding邏輯的***位置,因為在這個層面上,每一個DAO的方法都明確地知道需要訪問的數(shù)據(jù)表以及查詢參數(shù),借助這些信息可以直接定位到目標shard上,而不必像框架那樣需要對SQL進行解析然后再依據(jù)配置的規(guī)則進行路由。另一個優(yōu)勢是不會受ORM框架的制約。由于現(xiàn)在的大多數(shù)應(yīng)用在數(shù)據(jù)訪問層上會依賴某種ORM框架,而多數(shù)的shrading框架往往無法支持或只能支持一種orm框架,這使得在選擇和應(yīng)用框架時受到了很大的制約,而自行實現(xiàn)sharding完全沒有這方面的問題,甚至不同的shard使用不同的orm框架都可以在一起協(xié)調(diào)工作。比如現(xiàn)在的java應(yīng)用大多使用hibernate,但是當(dāng)下還沒有非常令人滿意的基于hibernate的sharding框架,(關(guān)于hibernate hards會在下文介紹),因此很多團隊會選擇自行實現(xiàn)sharding。

簡單總結(jié)一下,在DAO層自行實現(xiàn)sharding的優(yōu)勢在于:不受ORM框架的制約、實現(xiàn)起來較為簡單、易于根據(jù)系統(tǒng)特點進行靈活的定制、無需SQL解析和路由規(guī)則匹配,性能上表現(xiàn)會稍好一些;劣勢在于:有一定的技術(shù)門檻,工作量比依靠框架實現(xiàn)要大(反過來看,框架會有學(xué)習(xí)成本)、不通用,只能在特定系統(tǒng)里工作。當(dāng)然,在DAO層同樣可以通過XML配置或是注解將sharding邏輯抽離到“外部”,形成一套通用的框架. 不過目前還沒有出現(xiàn)此類的框架。

  • 在ORM框架層實現(xiàn)

在ORM框架層實現(xiàn)sharding有兩個方向,一個是在實現(xiàn)O-R Mapping的前提下同時提供sharding支持,從而定位為一種分布式的數(shù)據(jù)訪問框架,這一類類型的框架代表就是guzz另一個方向是通過對既有ORM框架進行修改增強來加入sharding機制。此類型的代表產(chǎn)品是hibernate shard. 應(yīng)該說以hibernate這樣主流的地位,行業(yè)對于一款面向hibernate的sharding框架的需求是非常迫切的,但是就目前的hibernate shards來看,表現(xiàn)還算不上令人滿意,主要是它對使用hibernate的限制過多,比如它對HQL的支持就非常有限。在mybatis方面,目前還沒有成熟的相關(guān)框架產(chǎn)生。有人提出利用mybatis的插件機制實現(xiàn)sharding,但是遺憾的是,mybatis的插件機制控制不到多數(shù)據(jù)源的連接層面,另一方面,離開插件層又失去了對sql進行集中解析和路由的機會,因此在mybatis框架上,目前還沒有可供借鑒的框架,團隊可能要在DAO層或Spring模板類上下功夫了。

  • 在JDBC API層實現(xiàn)

JDBC API層是很多人都會想到的一個實現(xiàn)sharding的***場所,如果我們能提供一個實現(xiàn)了sharding邏輯的JDBC API實現(xiàn),那么sharding對于整個應(yīng)用程序來說就是完全透明的,而這樣的實現(xiàn)可以直接作為通用的sharding產(chǎn)品了。但是這種方案的技術(shù)門檻和工作量顯然不是一般團隊能做得來的,因此基本上沒有團隊會在這一層面上實現(xiàn)sharding,甚至也沒有此類的開源產(chǎn)品。筆者知道的只有一款商業(yè)產(chǎn)品dbShards采用的是這一方案。

  • 在介于DAO與JDBC之間的Spring數(shù)據(jù)訪問封裝層實現(xiàn)

在springd大行其道的今天,幾乎沒有哪個java平臺上構(gòu)建的應(yīng)用不使用spring,在DAO與JDBC之間,spring提供了各種template來管理資源的創(chuàng)建與釋放以及與事務(wù)的同步,大多數(shù)基于spring的應(yīng)用都會使用template類做為數(shù)據(jù)訪問的入口,這給了我們另一個嵌入sharding邏輯的機會,就是通過提供一個嵌入了sharding邏輯的template類來完成sharding工作.這一方案在效果上與基于JDBC API實現(xiàn)的方案基本一致,同樣是對上層代碼透明,在進行sharding改造時可以平滑地過度,但它的實現(xiàn)卻比基于JDBC API的方式簡單,因此成為了不少框架的選擇,阿里集團研究院開源的Cobar Client就是這類方案的一種實現(xiàn)。

  • 在應(yīng)用服務(wù)器與數(shù)據(jù)庫之間通過代理實現(xiàn)

在應(yīng)用服務(wù)器與數(shù)據(jù)庫之間加入一個代理,應(yīng)用程序向數(shù)據(jù)發(fā)出的數(shù)據(jù)請求會先通過代理,代理會根據(jù)配置的路由規(guī)則,對SQL進行解析后路由到目標shard,因為這種方案對應(yīng)用程序完全透明,通用性好,所以成為了很多sharding產(chǎn)品的選擇。在這方面較為知名的產(chǎn)品是mysql官方的代理工具:Mysql Proxy和一款國人開發(fā)的產(chǎn)品:amoeba。mysql proxy本身并沒有實現(xiàn)任何sharding邏輯,它只是作為一種面向mysql數(shù)據(jù)庫的代理,給開發(fā)人員提供了一個嵌入sharding邏輯的場所,它使用lua作為編程語言,這對很多團隊來說是需要考慮的一個問題。amoeba則是專門實現(xiàn)讀寫分離與sharding的代理產(chǎn)品,它使用非常簡單,不使用任何編程語言,只需要通過xml進行配置。不過amoeba不支持事務(wù)(從應(yīng)用程序發(fā)出的包含事務(wù)信息的請求到達amoeba時,事務(wù)信息會被抹去,因此,即使是單點數(shù)據(jù)訪問也不會有事務(wù)存在)一直是個硬傷。當(dāng)然,這要看產(chǎn)品的定位和設(shè)計理念,我們只能說對于那些對事務(wù)要求非常高的系統(tǒng),amoeba是不適合的。

二、使用框架還是自主開發(fā)?

前面的討論中已經(jīng)羅列了很多開源框架與產(chǎn)品,這里再整理一下:基于代理方式的有MySQL Proxy和Amoeba,基于Hibernate框架的是Hibernate Shards,通過重寫spring的ibatis template類是Cobar Client,這些框架各有各的優(yōu)勢與短板,架構(gòu)師可以在深入調(diào)研之后結(jié)合項目的實際情況進行選擇,但是總的來說,我個人對于框架的選擇是持謹慎態(tài)度的。一方面多數(shù)框架缺乏成功案例的驗證,其成熟性與穩(wěn)定性值得懷疑。另一方面,一些從成功商業(yè)產(chǎn)品開源出框架(如阿里和淘寶的一些開源項目)是否適合你的項目是需要架構(gòu)師深入調(diào)研分析的。當(dāng)然,最終的選擇一定是基于項目特點、團隊狀況、技術(shù)門檻和學(xué)習(xí)成本等綜合因素考量確定的。 

責(zé)任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2022-06-22 07:32:53

Sharding分庫數(shù)據(jù)源

2023-07-24 09:00:00

數(shù)據(jù)庫MyCat

2025-04-03 09:39:14

2021-10-27 09:55:55

Sharding-Jd分庫分表Java

2025-04-01 08:45:00

2023-08-11 08:59:49

分庫分表數(shù)據(jù)數(shù)據(jù)庫

2024-03-20 08:12:12

分庫分表數(shù)據(jù)

2017-07-19 16:25:07

數(shù)據(jù)庫開發(fā)DB分庫主鍵生成策略

2024-08-13 17:09:00

架構(gòu)分庫分表開發(fā)

2017-07-17 14:45:43

數(shù)據(jù)庫DB分庫切分策略

2017-07-19 15:19:19

數(shù)據(jù)庫DB分庫實施策略

2020-07-30 17:59:34

分庫分表SQL數(shù)據(jù)庫

2019-11-12 09:54:20

分庫分表數(shù)據(jù)

2017-03-06 15:43:33

Springboot啟動

2024-07-10 08:42:39

2021-08-31 20:21:11

VitessMySQL分庫

2020-11-18 09:39:02

MySQL數(shù)據(jù)庫SQL

2020-11-06 15:30:23

分庫分表Sharding-JD數(shù)據(jù)庫

2017-07-21 14:50:15

數(shù)據(jù)庫DB分庫事務(wù)處理

2015-08-20 10:34:25

點贊
收藏

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