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

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

增量 設計 工作 日常生活 平臺 group 深圳 ges true

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

需求場景
某城市市區出於安全考慮,限制摩托車進入一定的區域範圍。某摩托車租賃公司,為了更好管理所轄摩托車的違章問題,對自己所轄摩托車安裝定位系統,定時采集摩托車位置。摩托車租賃公司,可以通過軌跡管理平臺,查詢統計違章情況,也可作為依據,提醒違章的租賃用戶,過多違章拉入黑名單;

查詢場景:【2018年11月01日】編號【id00001】的摩托車行駛軌跡與違章情況查詢;

樣例內嵌在表格存儲控制臺中,用戶可登錄控制臺體驗系統(若為表格存儲的新用戶,需要點擊開通服務後體驗,開通免費,訂單數據存儲在公共實例中,體驗不消耗用戶存儲、流量、Cu)。

表格存儲(TableStore)方案
采用表格存儲(TableStore)輕松搭建一套:億量級摩托車管理系統。多元索引功能提供GEO檢索、多維查詢的能力,通過對時間的排序獲取追蹤設備的軌跡。同時,用戶可隨時創建索引然後完成自動同步,不用擔心存量數據問題。
TableStore作為阿裏雲提供的一款全托管、零運維的分布式NoSql型數據存儲服務,具有【海量數據存儲】、【熱點數據自動分片】、【海量數據多維檢索】等功能,有效的地解決了GEO數據量大膨脹這一挑戰;

SearchIndex功能在保證用戶數據高可用的基礎上,提供了數據多維度搜索、排序等能力。針對多種場景創建多種索引,實現多種模式的檢索。用戶可以僅在需要的時候創建、開通索引。由TableStore來保證數據同步的一致性,這極大的降低了用戶的方案設計、服務運維、代碼開發等工作量。

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

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

2、創建實例

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

技術分享圖片

創建實例後,提交工單申請多元索引功能邀測(商業化後默認打開,不使用不收費)。

邀測地址:提工單,選擇【表格存儲】>【產品功能、特性咨詢】>【創建工單】,申請內容如下:
問題描述:請填寫【申請SearchIndex邀測】
機密信息:請填寫【地域+實例名】,例:上海+myInstanceName
技術分享圖片

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

技術分享圖片
三、開始搭建(核心代碼)
1、創建數據表
用戶僅需在完成邀測的實例下創建“摩托車軌跡表”:通過控制臺創建、管理數據表(用戶也可以通過SDK直接創建):其他表如租賃用戶表、摩托車信息表等,根據需求創建:這裏僅展示軌跡表,表名:geo_track

技術分享圖片

2、創建數據表索引
TableStore自動做全量、增量的索引數據同步:用戶可以通過控制臺創建索引、管理索引(也可以通過SDK創建索引)

技術分享圖片

技術分享圖片

3、數據導入
插入部分測試數據(控制臺樣例中插入了1.08億條(1萬輛摩托70天24小時*6個"10分鐘點")數據,用戶自己可以通過控制臺插入少量測試數據);

技術分享圖片

表名:geo_track

技術分享圖片
表名:moto_user

技術分享圖片
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);

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