1. 程式人生 > >《TableStore最佳實踐:輕鬆實現軌跡管理與地理圍欄》

《TableStore最佳實踐:輕鬆實現軌跡管理與地理圍欄》

一、方案背景

軌跡管理系統日常生活中使用非常普遍,如外賣派送軌跡、快遞物流流轉、車輛定位軌跡等。該場景與地理位置管理類似,核心點與瓶頸都在資料庫的儲存效能與查詢能力,同時需要時間欄位正序排列,保證軌跡點順序;一方面,儲存服務需要應對海量資料的低延遲存、讀,另一方面,儲存服務也要提供高效的多維度資料檢索與排序。表格儲存(TableStore)對於軌跡管理場景,依然可以勝任,完全具備實現軌跡管理系統的能力。
不妨來體驗一下基於TableStore打造的【億量級摩托車管理系統】樣例;

需求場景

某城市市區出於安全考慮,限制摩托車進入一定的區域範圍。某摩托車租賃公司,為了更好管理所轄摩托車的違章問題,對自己所轄摩托車安裝定位系統,定時採集摩托車位置。摩托車租賃公司,可以通過軌跡管理平臺,查詢統計違章情況,也可作為依據,提醒違章的租賃使用者,過多違章拉入黑名單;
查詢場景:【2018年11月01日】編號【id00001】的摩托車行駛軌跡與違章情況查詢;

樣例如下:
注:該樣例提供了【億量級】軌跡資料。官網控制檯地址:專案樣例

testGeoTrack

樣例內嵌在表格儲存控制檯中,使用者可登入控制檯體驗系統(若為表格儲存的新使用者,需要點選開通服務後體驗,開通免費,訂單資料儲存在公共例項中,體驗不消耗使用者儲存、流量、Cu)。

表格儲存(TableStore)方案

採用表格儲存(TableStore)輕鬆搭建一套:億量級摩托車管理系統。多元索引功能提供GEO檢索、多維查詢的能力,通過對時間的排序獲取追蹤裝置的軌跡。同時,使用者可隨時建立索引然後完成自動同步,不用擔心存量資料問題。
TableStore作為阿里雲提供的一款全託管、零運維的分散式NoSql型資料儲存服務,具有【海量資料儲存】、【熱點資料自動分片】、【海量資料多維檢索】等功能,有效的地解決了GEO資料量大膨脹這一挑戰;
SearchIndex功能在保證使用者資料高可用的基礎上,提供了資料多維度搜索、排序等能力。針對多種場景建立多種索引,實現多種模式的檢索。使用者可以僅在需要的時候建立、開通索引。由TableStore來保證資料同步的一致性,這極大的降低了使用者的方案設計、服務運維、程式碼開發等工作量。

二、搭建準備

若您對於基於TableStore實現的【億量級摩托車管理系統】體驗不錯,並希望開始自己系統的搭建之旅,只需按照如下步驟便可以著手搭建了:

1、開通表格儲存

通過控制檯開通表格儲存服務,表格儲存即開即用(後付費),採用按量付費方式,已為使用者提供足夠功能測試的免費額度。表格儲存官網控制檯免費額度說明

2、建立例項

通過控制檯建立表格儲存例項,選擇支援多元索引的Region。(當前階段SearchIndex功能尚未商業化,暫時開放北京,上海,杭州和深圳四地,其餘地區將逐漸開放)

image | left

建立例項後,提交工單申請多元索引功能邀測(商業化後預設開啟,不使用不收費)。

  • 邀測地址:提工單,選擇【表格儲存】>【產品功能、特性諮詢】>【建立工單】,申請內容如下:
  • 問題描述:請填寫【申請SearchIndex邀測】
  • 機密資訊:請填寫【地域+例項名】,例:上海+myInstanceName

image | left

3、SDK下載

使用具有多元索引(SearchIndex)的SDK,官網地址,暫時java、go、node.js三種SDK增加了新功能

java-SDK

<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>tablestore</artifactId>
    <version>4.7.4</version>
</dependency>

go-SDK

$ go get github.com/aliyun/aliyun-tablestore-go-sdk

4、表設計

店鋪檢索系統樣例,僅簡易使用一張店鋪表,主要包含欄位:店鋪型別、店鋪名稱、店鋪地理位置、店鋪平均評分、人均消費消等。表設計如下:
表名:geo_track

列名 資料型別 索引型別 欄位說明
_id(主鍵列) String   MD5(mId + timestamp)避免熱點
mId Stirng   摩托車編號
timestamp long LONG 時間點(毫秒時間戳)
pos String GEO_POINT 車輛位置:"30.132,120.082"(緯度,精度)
... ... ... ...

三、開始搭建(核心程式碼)

1、建立資料表

使用者僅需在完成邀測的例項下建立“摩托車軌跡表”:通過控制檯建立、管理資料表(使用者也可以通過SDK直接建立):其他表如租賃使用者表、摩托車資訊表等,根據需求建立:這裡僅展示軌跡表,表名:geo_track

image.png | left | 827x343

2、建立資料表索引

TableStore自動做全量、增量的索引資料同步:使用者可以通過控制檯建立索引、管理索引(也可以通過SDK建立索引)

image.png | left | 827x411

image.png | left | 827x230

3、資料匯入

插入部分測試資料(控制檯樣例中插入了1.08億條(1萬輛摩托70天24小時*6個"10分鐘點")資料,使用者自己可以通過控制檯插入少量測試資料);

image.png | left | 747x145

表名:geo_track

摩托車編號 軌跡點md5(mId + timestamp)(主鍵) 時間 店鋪位置
id00001 f50d55bec347253c24dc9144dff3e3b7 1541103600000 30.30094,120.01278

表名:moto_user

摩托車編號(主鍵) 摩托車顏色 摩托車品牌 摩托車租賃使用者
id00001 銀灰色 H牌摩托車 楊六

4、資料讀取

資料讀取分為兩類:

主鍵讀取(摩托車資訊查詢)

基於原生表格儲存的主鍵列獲取:getRow, getRange, batchGetRow等。主鍵讀取用於索引(自動)反查,使用者也可以提供主鍵(摩托車編號)單條查詢的頁面,查詢速度極快。單主鍵查詢方式不支援多維度檢索;

索引讀取(軌跡資訊查詢)

基於新SearchIndex功能Query:search介面。使用者可以自由設計索引欄位的多維度條件組合查詢。通過設定選擇不同的查詢引數,構建不同的查詢條件、不同排序方式;目前支援:精確查詢、範圍查詢、字首查詢、匹配查詢、萬用字元查詢、短語匹配查詢、分詞字串查詢,並通過布林與、或組合。
如【2018年11月01日,id00001號摩托車,行駛軌跡及違章查詢】Query條件如下:

List<Query> mustQueries = new ArrayList<Query>();
List<String> polygonList = Arrays.asList(//地理圍欄,禁摩區域
    "30.262348,120.092127",
    "30.311668,120.079761",
    "30.332413,120.129371",
    ...
);
String mId = "id00001";
Long timeStart = [2018-11-01時間戳];
Long timeEnd = [2018-11-02時間戳];

GeoPolygonQuery geoPolygonQuery = new GeoPolygonQuery();
geoPolygonQuery.setPoints(polygonList);
geoPolygonQuery.setFieldName("pos");
mustQueries.add(geoPolygonQuery);

TermQuery termQuery = new TermQuery();
termQuery.setFieldName("mId");
termQuery.setTerm(ColumnValue.fromString(request.getmId()));
mustQueries.add(termQuery);

RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("timestamp");
rangeQuery.setFrom(ColumnValue.fromDouble(timeStart, true);
rangeQuery.setTo(ColumnValue.fromDouble(timeEnd, false);
mustQueries.add(rangeQuery);

BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(mustQueries);

 

原文連結
本文為雲棲社群原創內容,未經允許不得轉載。