欧美精品123_精品露脸国产偷人在视频_日韩美女免费线视频_成人av三级

美團點評商家登錄(美團點評登錄網址)

前沿拓展:

美團點評商家登錄

美團點評,商家店鋪可以展示多少個視頻?如果你點評的話可以有很多之別,但是一次只能發五個。


歡迎關注我的號:Wooola,10年Java軟件開發及架構設計經驗,專注于Java、Golang、微服務架構,致力于每天分享原創文章、快樂編碼和開源技術。
背景

2016年Q3季度初,在美團外賣上單2.0項目上線后,商家和商品數量急速增長,預估商品庫的容量和寫峰值QPS會很快遇到巨大壓力。隨之而來也會影響線上服務的查詢性能、DB(數據庫,以下統一稱DB)主從延遲、表變更困難等一系列問題。

要解決上面所說的問題,通常有兩種方案。第一種方案是直接對現有的商品庫進行垂直拆分,可以緩解目前寫峰值QPS過大、DB主從延遲的問題。第二種方案是對現有的商品庫大表進行分庫分表,從根本上解決現有問題。方案一實施起來周期較短,但只能解決一時之痛,由此可見,分庫分表是必然的。

在確定分庫分表的方案之后,我們調研了外賣訂單、結算以及主站等業務的分庫分表實現方案,也調研了業界很多分庫分表中間件。在綜合考慮性能、穩定性及實現成本的前提下,最終決定自主研發客戶端分庫分表中間件MTDDL來支撐外賣商品分庫分表項目,這也就是MTDDL的由來。

當然,在MTDDL的設計研發過程中,我們充分考慮了MTDDL的通用性、可擴展性、功能的全面性和接入的便利性。到目前為止一共開發了四期,實現了MySQL動態數據源、讀寫分離、分布式唯一主鍵生成器、分庫分表、連接池及SQL**、動態化配置等一系列功能,支持分庫分表算法、分布式唯一主鍵生成算法的高可擴展性,而且支持全注解的方式接入,業務方不需要引入任何配置文件。

下面就部分業界方案及MTDDL的設計目標詳細展開下,然后從源碼的角度來剖析下MTDDL的整個邏輯架構和具體實現。

業界調研

業界組件簡介實現方案功能特性優點缺點AtlasQihoo 360開發維護的一個基于MySQL協議的數據中間層項目。它實現了MySQL的客戶端與服務端協議,作為服務端與應用程序通信,同時作為客戶端與MySQL通信proxy-based實現讀寫分離、單庫分表功能簡單,性能跟穩定性較好不支持分庫分表MTAtlas原美團DBA團隊在開源Atlas基礎上做的一系列升級改造proxy-based在讀寫分離、單庫分表的基礎上,完成了分庫分表的功能開發在Atlas基礎上支持了分庫分表當時還處于測試階段,暫不推薦業務方使用TDDL淘寶根據自己的業務特點開發了TDDL框架,主要解決了分庫分表對應用的透明化以及異構數據庫之間的數據**,它是一個基于集中式配置的JDBC datasource實現client-based實現動態數據源、讀寫分離、分庫分表功能齊全分庫分表功能還未開源,當前公布文檔較少,并且需要依賴diamond(淘寶內部使用的一個管理持久配置的系統)ZebraZebra是原點評內部使用數據源、DAO以及**等和數據庫打交道的中間件集client-based實現動態數據源、讀寫分離、分庫分表、CAT**功能齊全且有**接入較為復雜,當時只支持c3p0、Druid、Tomcat JDBC等連接池,且分庫分表算法只支持Groovy表達式不易擴展

設計目標

MTDDL(Meituan Distributed Data Layer),美團點評分布式數據訪問層中間件,旨在為全公司提供一個通用數據訪問層服務,支持MySQL動態數據源、讀寫分離、分布式唯一主鍵生成器、分庫分表、動態化配置等功能,并且支持從客戶端角度對數據源的各方面(比如連接池、SQL等)進行**,后續考慮支持NoSQL、Cache等多種數據源。

功能特性

動態數據源讀寫分離分布式唯一主鍵生成器分庫分表連接池及SQL**動態化配置

邏輯架構

下圖是一次完整的DAO層insert方法調用時序圖,簡單闡述了MTDDL的整個邏輯架構。其中包含了分布式唯一主鍵的獲取、動態數據源的路由以及SQL埋點**等過程:

美團點評商家登錄(美團點評登錄網址)

具體實現

動態數據源及讀寫分離

在Spring JDBC AbstractRoutingDataSource的基礎上擴展出MultipleDataSource動態數據源類,通過動態數據源注解及AOP實現。

動態數據源

MultipleDataSource動態數據源類,繼承于Spring JDBC AbstractRoutingDataSource抽象類,實現了determineCurrentLookupKey方法,通過setDataSourceKey方法來動態調整dataSourceKey,進而達到動態調整數據源的功能。其類圖如下:

美團點評商家登錄(美團點評登錄網址)

動態數據源AOP

ShardMultipleDataSourceAspect動態數據源切面類,針對DAO方法進行功能增強,通過掃描DataSource動態數據源注解來獲取相應的dataSourceKey,從而指定具體的數據源。具體流程圖如下:

美團點評商家登錄(美團點評登錄網址)

配置和使用方式舉例

/**
* 參考配置
*/
<bean >
/** 數據源配置 */
<property name=”targetDataSources”>
<map key-type=”java.lang.String”>
/** 寫數據源 */
<entry key=”dbProductWrite” value-ref=”dbProductWrite”/>
/** 讀數據源 */
<entry key=”dbProductRead” value-ref=”dbProductRead”/>
</map>
</property>
</bean>
/**
* DAO使用動態數據源注解
*/
public interface WmProductSkuDao {
/** 增刪改走寫數據源 */
@DataSource(“dbProductWrite”)
public void insert(WmProductSku sku);
/** 查詢走讀數據源 */
@DataSource(“dbProductRead”)
public void getById(long sku_id);
}
分布式唯一主鍵生成器

眾所周知,分庫分表首先要解決的就是分布式唯一主鍵的問題,業界也有很多相關方案:

美團點評商家登錄(美團點評登錄網址)

綜上,方案3的缺點可以通過一些手段避免,但其他方案的缺點不好處理,所以選擇第3種方案。目前該方案已由美團點評技術工程部實現——分布式ID生成系統Leaf,MTDDL集成了此功能。

分布式ID生成系統Leaf

美團點評分布式ID生成系統Leaf,其實是一種基于DB的Ticket服務,通過一張通用的Ticket表來實現分布式ID的持久化,執行update更新語句來獲取一批Ticket,這些獲取到的Ticket會在內存中進行分配,分配完之后再從DB獲取下一批Ticket。整體架構圖如下:

美團點評商家登錄(美團點評登錄網址)

每個業務tag對應一條DB記錄,DB MaxID字段記錄當前該Tag已分配出去的最大ID值。

IDGenerator服務啟動之初向DB申請一個號段,傳入號段長度如 genStep = 10000,DB事務置 MaxID = MaxID + genStep,DB設置成功代表號段分配成功。每次IDGenerator號段分配都通過原子加的方式,待分配完畢后重新申請新號段。

唯一主鍵生成算法擴展

MTDDL不僅集成了Leaf算法,還支持唯一主鍵算法的擴展,通過新增唯一主鍵生成策略類實現IDGenStrategy接口即可。IDGenStrategy接口包含兩個方法:getIDGenType用來指定唯一主鍵生成策略,getId用來實現具體的唯一主鍵生成算法。其類圖如下:

美團點評商家登錄(美團點評登錄網址)

分庫分表

在動態數據源AOP的基礎上擴展出分庫分表AOP,通過分庫分表ShardHandle類實現分庫分表數據源路由及分表計算。ShardHandle關聯了分庫分表上下文ShardContext類,而ShardContext封裝了所有的分庫分表算法。其類圖如下:

美團點評商家登錄(美團點評登錄網址)

分庫分表流程圖如下:

美團點評商家登錄(美團點評登錄網址)

分庫分表取模算法

分庫分表目前默認使用的是取模算法,分表算法為 (#shard_key % (group_shard_num * table_shard_num)),分庫算法為 (#shard_key % (group_shard_num * table_shard_num)) / table_shard_num,其中group_shard_num為分庫個數,table_shard_num為每個庫的分表個數。

例如把一張大表分成100張小表然后散到2個庫,則0-49落在第一個庫、50-99落在第二個庫。核心實現如下:

public class ModStrategyHandle implements ShardStrategy {
@Override
public String getShardType() {
return “mod”;
}
@Override
public DataTableName handle(String tableName, String dataSourceKey, int tableShardNum,
int dbShardNum, Object shar**alue) {
/** 計算散到表的值 */
long shard_value = Long.valueOf(shar**alue.toString());
long tablePosition = shard_value % tableShardNum;
long dbPosition = tablePosition / (tableShardNum / dbShardNum);
String finalTableName = new StringBuilder().append(tableName).append(“_”).append(tablePosition).toString();
String finalDataSourceKey = new StringBuilder().append(dataSourceKey).append(dbPosition).toString();
return new DataTableName(finalTableName, finalDataSourceKey);
}
}

分庫分表算法擴展

MTDDL不僅支持分庫分表取模算法,還支持分庫分表算法的擴展,通過新增分庫分表策略類實現ShardStrategy接口即可。ShardStrategy接口包含兩個方法:getShardType用來指定分庫分表策略,handle用來實現具體的數據源及分表計算邏輯。其類圖如下:

美團點評商家登錄(美團點評登錄網址)

全注解方式接入

為了盡可能地方便業務方接入,MTDDL采用全注解方式使用分庫分表功能,通過ShardInfo、ShardOn、IDGen三個注解實現。

ShardInfo注解用來指定具體的分庫分表配置:包括分表名前綴tableName、分表數量tableShardNum、分庫數量dbShardNum、分庫分表策略shardType、唯一鍵生成策略idGenType、唯一鍵業務方標識idGenKey;ShardOn注解用來指定分庫分表字段;IDGen注解用來指定唯一鍵字段。具體類圖如下:

美團點評商家登錄(美團點評登錄網址)

配置和使用方式舉例

// 動態數據源
@DataSource(“dbProductSku”)
// tableName:分表名前綴,tableShardNum:分表數量,dbShardNum:分庫數量,shardType:分庫分表策略,idGenType:唯一鍵生成策略,idGenKey:唯一鍵業務方標識
@ShardInfo(tableName=”wm_food”, tableShardNum=100, dbShardNum=1, shardType=”mod”, idGenType=IDGenType.LEAF, idGenKey=LeafKey.SKU)
@Component
public interface WmProductSkuShardDao {
// @ShardOn(“wm_poi_id”) 將該注解修飾的對象的wm_poi_id字段作為shar**alue
// @IDGen(“id”) 指定要設置唯一鍵的字段
public void insert(@ShardOn(“wm_poi_id”) @IDGen(“id”) WmProductSku sku);
// @ShardOn 將該注解修飾的參數作為shar**alue
public List<WmProductSku> getSku**yWmPoiId(@ShardOn long wm_poi_id);
}

連接池及SQL**

DB連接池使用不合理容易引發很多問題,如連接池最大連接數設置過小導致線程獲取不到連接、獲取連接等待時間設置過大導致很多線程掛起、空閑連接回收器運行周期過長導致空閑連接回收不及時等等,如果缺乏有效準確的**,會造成無法快速**問題以及追溯歷史。

再者,如果缺乏SQL執行情況相關**,會很難及時發現DB慢查詢等潛在風險,而慢查詢往往就是DB服務端性能惡化乃至宕機的根源(關于慢查詢,推薦閱讀《MySQL索引原理及慢查詢優化》一文)。MTDDL從1.0.2版本開始正式引入連接池及SQL**等相關功能。

連接池**

實現方案

結合Spring完美適配c3p0、dbcp1、dbcp2、mtthrift等多種方案,自動發現新加入到Spring容器中的數據源進行**,通過美團點評統一**組件JMonitor上報**數據。整體架構圖如下:

美團點評商家登錄(美團點評登錄網址)

連接數量**

**連接池active、idle、total連接數量,Counter格式:(連接池類型.數據源.active/idle/total_connection),效果圖如下:

美團點評商家登錄(美團點評登錄網址)

獲取連接時間**

**獲取空閑連接時間,Counter格式:(ds.getConnection.數據源.time),效果圖如下:

美團點評商家登錄(美團點評登錄網址)

SQL**

實現方案

采用Spring AOP技術對所有DAO方法進行功能增強處理,通過美團點評分布式會話跟蹤組件MTrace進行SQL調用數據埋點及上報,進而實現從客戶端角度對SQL執行耗時、QPS、調用量、超時率、失敗率等指標進行**。整體架構圖如下:

美團點評商家登錄(美團點評登錄網址)

實現效果

登錄美團點評的服務治理平臺OCTO選擇服務查看去向分析,效果圖如下:

美團點評商家登錄(美團點評登錄網址)

動態化配置

為了滿足業務方一些動態化需求,如解決線上DB緊急事故需動態調整數據源或者分庫分表相關配置,要求無需重啟在線修改立即生效,MTDDL從1.0.3版本開始正式引入動態化配置相關功能。

實現方案

在Spring容器啟動的時候自動注冊數據源及分庫分表相關配置到美團點評的統一配置中心MCC,在MCC配置管理頁面可以進行動態調整,MCC客戶端在感知到變更事件后會刷新本地配置,如果是數據源配置變更會根據新的配置構造出一個新數據源來替換老數據源,最后再將老的數據源優雅關閉掉。具體流程圖如下:

美團點評商家登錄(美團點評登錄網址)

動態化數據源

目前支持dbcp、dbcp2、c3p0等數據源,效果圖如下:

美團點評商家登錄(美團點評登錄網址)

分庫分表動態化

支持動態化配置分庫分表數量、分庫分表策略、唯一鍵生成策略、唯一鍵業務方標識等,效果圖如下:

美團點評商家登錄(美團點評登錄網址)

版本迭代

MTDDL到目前為止總共開發了四期,后續考慮逐步開源,具體版本迭代如下:

美團點評商家登錄(美團點評登錄網址)

拓展知識:

美團點評商家登錄

聽說是屬于合并了,不過賬號好像還是不同的,都是單獨的賬號,可以使用手機號碼注冊登陸。這個比較方便一些。也比較容易記住。

本回答被提問者采納

原創文章,作者:九賢互聯網實用分享網小編,如若轉載,請注明出處:http://www.uuuxu.com/20220920473243.html

主站蜘蛛池模板: 江口县| 时尚| 沾化县| 从江县| 合江县| 沐川县| 旺苍县| 玛纳斯县| 安溪县| 诸暨市| 哈巴河县| 浦城县| 长治县| 石台县| 连城县| 宜兰市| 沭阳县| 于田县| 宁国市| 鄂州市| 尼木县| 屏东市| 闵行区| 隆德县| 微博| 鄂伦春自治旗| 油尖旺区| 瑞安市| 清涧县| 安化县| 增城市| 常山县| 二手房| 延寿县| 丰原市| 雅安市| 文化| 荃湾区| 巨野县| 淮滨县| 万州区|