軌跡管理系統平常生活中使用很是廣泛,如外賣派送軌跡、快遞物流流轉、車輛定位軌跡等。該場景與地理位置管理相似,核心點與瓶頸都在數據庫的存儲性能與查詢能力,同時須要時間字段正序排列,保證軌跡點順序;一方面,存儲服務須要應對海量數據的低延遲存、讀,另外一方面,存儲服務也要提供高效的多維度數據檢索與排序。表格存儲(TableStore)對於軌跡管理場景,依然能夠勝任,徹底具有實現軌跡管理系統的能力。
不妨來體驗一下基於TableStore打造的【億量級摩托車管理系統】樣例;html
某城市市區出於安全考慮,限制摩托車進入必定的區域範圍。某摩托車租賃公司,爲了更好管理所轄摩托車的違章問題,對本身所轄摩托車安裝定位系統,定時採集摩托車位置。摩托車租賃公司,能夠經過軌跡管理平臺,查詢統計違章狀況,也可做爲依據,提醒違章的租賃用戶,過多違章拉入黑名單;
查詢場景:【2018年11月01日】編號【id00001】的摩托車行駛軌跡與違章狀況查詢;java
樣例以下:
注:該樣例提供了【億量級】軌跡數據。官網控制檯地址:項目樣例node
樣例內嵌在表格存儲控制檯中,用戶可登陸控制檯體驗系統(若爲表格存儲的新用戶,須要點擊開通服務後體驗,開通免費,訂單數據存儲在公共實例中,體驗不消耗用戶存儲、流量、Cu)。git
採用表格存儲(TableStore)輕鬆搭建一套:億量級摩托車管理系統。多元索引功能提供GEO檢索、多維查詢的能力,經過對時間的排序獲取追蹤設備的軌跡。同時,用戶可隨時建立索引而後完成自動同步,不用擔憂存量數據問題。
TableStore做爲阿里雲提供的一款全託管、零運維的分佈式NoSql型數據存儲服務,具備【海量數據存儲】、【熱點數據自動分片】、【海量數據多維檢索】等功能,有效的地解決了GEO數據量大膨脹這一挑戰;
SearchIndex功能在保證用戶數據高可用的基礎上,提供了數據多維度搜索、排序等能力。針對多種場景建立多種索引,實現多種模式的檢索。用戶能夠僅在須要的時候建立、開通索引。由TableStore來保證數據同步的一致性,這極大的下降了用戶的方案設計、服務運維、代碼開發等工做量。github
若您對於基於TableStore實現的【億量級摩托車管理系統】體驗不錯,並但願開始本身系統的搭建之旅,只需按照以下步驟即可以着手搭建了:數據庫
經過控制檯開通表格存儲服務,表格存儲即開即用(後付費),採用按量付費方式,已爲用戶提供足夠功能測試的免費額度。表格存儲官網控制檯、免費額度說明。安全
經過控制檯建立表格存儲實例,選擇支持多元索引的Region。(當前階段SearchIndex功能還沒有商業化,暫時開放北京,上海,杭州和深圳四地,其他地區將逐漸開放)運維
建立實例後,提交工單申請多元索引功能邀測(商業化後默認打開,不使用不收費)。分佈式
使用具備多元索引(SearchIndex)的SDK,官網地址,暫時java、go、node.js三種SDK增長了新功能性能
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore</artifactId> <version>4.7.4</version> </dependency>
$ go get github.com/aliyun/aliyun-tablestore-go-sdk
店鋪檢索系統樣例,僅簡易使用一張店鋪表,主要包含字段:店鋪類型、店鋪名稱、店鋪地理位置、店鋪平均評分、人均消費消等。表設計以下:
表名:geo_track
列名 | 數據類型 | 索引類型 | 字段說明 |
---|---|---|---|
_id(主鍵列) | String | MD5(mId + timestamp)避免熱點 | |
mId | Stirng | 摩托車編號 | |
timestamp | long | LONG | 時間點(毫秒時間戳) |
pos | String | GEO_POINT | 車輛位置:"30.132,120.082"(緯度,精度) |
... | ... | ... | ... |
用戶僅需在完成邀測的實例下建立「摩托車軌跡表」:經過控制檯建立、管理數據表(用戶也能夠經過SDK直接建立):其餘表如租賃用戶表、摩托車信息表等,根據需求建立:這裏僅展現軌跡表,表名:geo_track
TableStore自動作全量、增量的索引數據同步:用戶能夠經過控制檯建立索引、管理索引(也能夠經過SDK建立索引)
插入部分測試數據(控制檯樣例中插入了1.08億條(1萬輛摩托70天24小時*6個"10分鐘點")數據,用戶本身能夠經過控制檯插入少許測試數據);
表名:geo_track
摩托車編號 | 軌跡點md5(mId + timestamp)(主鍵) | 時間 | 店鋪位置 |
---|---|---|---|
id00001 | f50d55bec347253c24dc9144dff3e3b7 | 1541103600000 | 30.30094,120.01278 |
表名:moto_user
摩托車編號(主鍵) | 摩托車顏色 | 摩托車品牌 | 摩托車租賃用戶 |
---|---|---|---|
id00001 | 銀灰色 | H牌摩托車 | 楊六 |
數據讀取分爲兩類:
基於原生表格存儲的主鍵列獲取: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);