Timestream开发最佳实践
背景
Timestream模型是針對時序場景設(shè)計的特有模型,可以讓用戶快速完成業(yè)務(wù)代碼的開發(fā),實(shí)現(xiàn)相關(guān)業(yè)務(wù)需求。但是,如果業(yè)務(wù)系統(tǒng)不僅想實(shí)現(xiàn)基礎(chǔ)的相關(guān)業(yè)務(wù)功能,還要達(dá)到最佳的性能,并且兼顧到未來的擴(kuò)展性的話,就不是一件特別容易的事情。
本文會以共享汽車管理平臺為例,介紹一系列的timestream最佳設(shè)計和使用,給業(yè)務(wù)設(shè)計和使用提供一些參考。
場景和模型簡介
在共享汽車管理平臺這個場景中,主要是對車輛的狀態(tài)軌跡監(jiān)控、車倆元數(shù)據(jù)以及訂單元數(shù)據(jù)進(jìn)行管理。另外,還會對相關(guān)的數(shù)據(jù)進(jìn)行計算分析并存儲相關(guān)結(jié)果:
- 車輛狀態(tài)軌跡:記錄了車輛的狀態(tài)監(jiān)控,比如車速、位置、續(xù)航等數(shù)據(jù),另外還需要記錄車輛行駛過程中的違章記錄,比如:是否超速、是否闖紅燈等等;
- 車輛元數(shù)據(jù):記錄車輛的基本屬性信息,便于用戶進(jìn)行車輛檢索,比如:車型、車牌、顏色等;
- 訂單元數(shù)據(jù):訂單相關(guān)信息記錄,包含行程的起止時間、車輛、用戶、費(fèi)用等信息
業(yè)務(wù)主要是對上面三部分?jǐn)?shù)據(jù)進(jìn)行查詢和檢索,滿足業(yè)務(wù)場景的需求。其中車輛元數(shù)據(jù)以及狀態(tài)軌跡數(shù)據(jù)是典型的時序序列,可以很方便的映射到Timestream模型中。
下圖是數(shù)據(jù)模型的映射:
下面介紹一下模型設(shè)計的細(xì)節(jié)以及設(shè)計中需要注意的一些優(yōu)化點(diǎn),這些優(yōu)化點(diǎn)對于業(yè)務(wù)功能以及性能上都有一定的提升。
業(yè)務(wù)模型設(shè)計
在Timestream模型中,主要包含了元數(shù)據(jù)和數(shù)據(jù)點(diǎn)兩部分?jǐn)?shù)據(jù),分別使用一個元數(shù)據(jù)表以及若干個數(shù)據(jù)表進(jìn)行存儲。下面介紹這兩類數(shù)據(jù)在存儲設(shè)計的關(guān)鍵點(diǎn)。
元數(shù)據(jù)表設(shè)計
在共享汽車這個場景下,元數(shù)據(jù)表主要存儲兩類數(shù)據(jù):車輛的基本信息、車輛的最近狀態(tài)數(shù)據(jù)(位置、續(xù)航、狀態(tài)、違章統(tǒng)計等),業(yè)務(wù)會根據(jù)各類信息進(jìn)行多條件的組合查詢符合條件的車輛。
如上圖所示,Timestream的元數(shù)據(jù)表會通過多元索引來提供豐富的數(shù)據(jù)檢索能力。在Timestream模型的元數(shù)據(jù)中,包含了name、tags、attributes三類數(shù)據(jù),其中name、tags默認(rèn)會提供數(shù)據(jù)檢索能力,attributes則需要在創(chuàng)建Meta表的時候指定需要索引的attributes字段以及相關(guān)信息,默認(rèn)attributes并不支持檢索。
需要注意的是,目前并不支持動態(tài)修改Meta表的索引字段,所以最好能在設(shè)計之初能夠考慮到當(dāng)前以及未來的功能需求,下面介紹一下相關(guān)信息是如何映射到模型以及相關(guān)的設(shè)計。
name設(shè)計
name字段的選取是很關(guān)鍵的,是數(shù)據(jù)檢索性能的一個重要影響因素,不同的name字段設(shè)計可能會導(dǎo)致查詢延時相差一個數(shù)量級。name字段的選取建議滿足以下條件:
- 絕大多數(shù)查詢場景都會對該字段進(jìn)行精確查詢
- 該字段單個取值下的最大記錄數(shù)不宜過多,比如說不超過一千萬條記錄
在共享汽車管理平臺這個場景下,管理的是各個平臺的車輛,而在車輛檢索的時候,一定會指定的條件是平臺的名字,并且某個平臺的車輛其實(shí)也不會太多,一般也就百萬量級,所以這里可以將平臺作為name。
tags設(shè)計
在Timestream模型中,Name和Tags可以唯一確定某個元數(shù)據(jù),在這個場景中,唯一確定某輛車的信息是:平臺、車輛ID,其中平臺是name,所以,tags中只需要存儲ID即可。
tags設(shè)計需要注意:
- tags的總長度盡可能的短,只把唯一確定主體的信息放到tag中,其余信息均放到attributes中
- tag只支持string類型的數(shù)據(jù),如果業(yè)務(wù)字段是數(shù)值類型,需要將其轉(zhuǎn)成string進(jìn)行存儲
attributes設(shè)計
attributes是主體的可變屬性,也可以用來存儲主體的非唯一屬性。在這個場景中,車輛的基本信息以及當(dāng)前狀態(tài)都是用attributes來進(jìn)行存儲。attributes設(shè)計關(guān)鍵點(diǎn):
- 創(chuàng)建meta表的時候需要指定有檢索需求的attributes以及相關(guān)屬性,默認(rèn)attributes是不支持索引的
- 數(shù)值型數(shù)據(jù)盡可能使用int來存儲,attribute支持多類型的數(shù)據(jù),但在數(shù)據(jù)檢索過程中,int類型的數(shù)據(jù)檢索效率比string類型高的多,建議使用int,索引類型為LONG
- 考慮未來系統(tǒng)的擴(kuò)展性,可以預(yù)留一列作為擴(kuò)展字段,索引類型為KEYWORD,并且是Array
索引創(chuàng)建示例代碼:
public void createMetaTable() {db.createMetaTable(Arrays.asList(new AttributeIndexSchema("地區(qū)", AttributeIndexSchema.Type.KEYWORD),...// 數(shù)值類型索引new AttributeIndexSchema("座位", AttributeIndexSchema.Type.LONG), ...// 擴(kuò)展字段,數(shù)組類型索引new AttributeIndexSchema("配置1", AttributeIndexSchema.Type.KEYWORD).isArray() ));數(shù)據(jù)表設(shè)計
Timestream可以支持多個數(shù)據(jù)表的存儲,來滿足不同的業(yè)務(wù)場景需求。另外,為了能夠利用底層引擎所做的性能優(yōu)化,我們推薦append的寫入方式,即不會對已有數(shù)據(jù)進(jìn)行修改,所以在以下場景中,我們建議業(yè)務(wù)將數(shù)據(jù)分到不同數(shù)據(jù)表中進(jìn)行存儲:
- 數(shù)據(jù)精度不同,特別是在監(jiān)控場景下,這個需求更加突出。按數(shù)據(jù)精度分表便于后續(xù)數(shù)據(jù)的查詢,如果查詢長周期的數(shù)據(jù)可以去查詢低精度的表,減少查詢的數(shù)據(jù)量,提高查詢效率
- 需要對數(shù)據(jù)進(jìn)行加工處理,也就是會對數(shù)據(jù)進(jìn)行更新,建議將處理之后的數(shù)據(jù)寫到另外一張表中
在共享汽車這個場景中,需要對車輛的狀態(tài)軌跡數(shù)據(jù)進(jìn)行流式處理,比如檢測是否超速等違章、車輛狀態(tài)軌跡是否異常等,然后將處理之后的數(shù)據(jù)寫到另外一張表中,提供給業(yè)務(wù)進(jìn)行查詢。
sdk使用
前面介紹了業(yè)務(wù)模型設(shè)計需要注意的地方,對業(yè)務(wù)功能拓展能力以及性能都有一定的提升。下面介紹一下timestream sdk使用的一些性能優(yōu)化點(diǎn)。
數(shù)據(jù)寫入
元數(shù)據(jù)
元數(shù)據(jù)寫入支持兩種方式:put和update。其中put會刪除老的記錄,并且插入一個全新行;update則是對原有記錄的部分attributes進(jìn)行更新。建議盡量使用Put的方式進(jìn)行寫入。
示例代碼:
數(shù)據(jù)點(diǎn)
數(shù)據(jù)點(diǎn)寫入也提供了兩種方式:同步和異步。其中異步接口底層是通過TableStoreWriter進(jìn)行異步寫入,其寫入吞吐能力更高,對寫入延時不是特別敏感的業(yè)務(wù)建議使用異步方式。
示例代碼:
數(shù)據(jù)查詢
元數(shù)據(jù)查詢
元數(shù)據(jù)查詢的時候,建議指定需要返回的列名。如果沒有顯示指定列名的話,會去讀主表以獲取完整的信息,這樣每一行元數(shù)據(jù)都會反查一次主表,查詢性能會更差一些。
示例代碼:
總結(jié)
本文介紹了Tablestore Timestream在模型設(shè)計以及sdk使用中的一些優(yōu)化點(diǎn),對于業(yè)務(wù)現(xiàn)有功能實(shí)現(xiàn)、未來拓展以及性能提升都有很好的作用
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Timestream开发最佳实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻松构建基于 Serverless 架构
- 下一篇: 阿里技术专家详解 DDD 系列- Dom