六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

TDengine在數(shù)字治理系統(tǒng)中處理軌跡數(shù)據(jù)的應(yīng)用

雅恒科技 黃勇

2020-01-15 / ,

背景介紹:廣州市雅恒信息科技有限公司專注提供優(yōu)質(zhì)的互聯(lián)網(wǎng)整體解決方案,在數(shù)字治理系統(tǒng)開發(fā)有著成熟豐富的經(jīng)驗。數(shù)字治理系統(tǒng)是基于城鄉(xiāng)治理的概念,對治理過程進行信息化的記錄和管理,并加以大數(shù)據(jù)分析、智能硬件監(jiān)測和無人機巡查輔助。城鄉(xiāng)治理是指基層政府對行政區(qū)域內(nèi)進行網(wǎng)絡(luò)的劃分,并將每個網(wǎng)格責(zé)任到網(wǎng)格員,網(wǎng)格員通過開展巡查活動,對發(fā)現(xiàn)的問題進行上報、交辦、處理、跟蹤的過程。

巧遇TDengine

2019年首次聽說TDengine Database,真正接觸是從收到一個直播的鏈接轉(zhuǎn)發(fā),陶建輝老師在極客時間直播,標(biāo)題這樣描述:35年碼齡老程序員給您講述TDengine的超高性能是如何實現(xiàn)的。直播現(xiàn)場,陶老師大汗淋漓,大家都在說沒開空調(diào),主持人解釋,陶老師現(xiàn)在高燒,堅持給大家講解。感性與理性。之后,深圳見面會,老板時間挺忙,趕在最后一天去的,沒有見到陶老師,見到了我們的侯老師。一聊,相見恨晚。

TDengine在數(shù)字治理系統(tǒng)中處理軌跡數(shù)據(jù)的應(yīng)用 - TDengine Database 時序數(shù)據(jù)庫

場景介紹

雅恒做了接近兩年的“基層數(shù)字網(wǎng)格管理系統(tǒng)”。這個管理系統(tǒng)能夠?qū)︽?zhèn)街進行大小網(wǎng)格的劃分,以網(wǎng)格內(nèi)建筑和核心部件為基本信息點,在網(wǎng)格內(nèi)開展消防、禁毒、環(huán)衛(wèi)、兩違等巡查活動,并形成規(guī)范上傳、下達工作流程規(guī)范。但我們這段時間其實也在琢磨這個系統(tǒng)的架構(gòu)是不是已經(jīng)老了,該如何優(yōu)化呢?這時候正好通過TDengine了解到時序數(shù)據(jù)庫(Time-Series Database)的概念,應(yīng)用后雖然不能一步到位把系統(tǒng)做一個很大的提升,但產(chǎn)品不是應(yīng)該這樣一點點改進嗎?

在我們的應(yīng)用場景中,網(wǎng)格員在使用app和小程序進行巡查活動時,每隔30秒會檢查一次移動距離,如果超過20米就會上傳一個坐標(biāo)到服務(wù)端。一個街道大約有100名網(wǎng)格員,每月有效巡查距離超過100公里,一年約1200000米;一個街道一年就會產(chǎn)生約6000000條坐標(biāo)記錄(武漢大約有一萬七千名網(wǎng)格員)。我們有可能隨時翻閱三年前某條巡查線路。按原關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)設(shè)計,這就需要從坐標(biāo)記錄表里根據(jù)巡查線路id檢索出一個個的坐標(biāo)點,然后重組成一條巡查線路。三年的記錄總量接近2000萬條,此時關(guān)系型數(shù)據(jù)庫的查詢響應(yīng)應(yīng)急非常慢,必須要通過按照時間分庫分表來提高性能,但隨之而來的問題就是遇到跨庫跨表查詢時間段處理的麻煩(想想就覺得累)。

我們基于TDengine Database的特性以及使用原則,把坐標(biāo)記錄數(shù)據(jù)遷移到這上面來:

  1. 一個網(wǎng)格賬號一張坐標(biāo)記錄表,這個網(wǎng)格員巡查產(chǎn)生的坐標(biāo)記錄全都按時間順序記錄到這個表上來;
  2. 巡查線路坐標(biāo)點的檢索按線路的巡查時間范圍,時序數(shù)據(jù)庫對時間的處理是天生的優(yōu)勢,這樣也降低了跨庫的耦合;
  3. 我們還借助了微服務(wù)低耦合易擴展的特性,獨立出坐標(biāo)讀寫模塊,以下是完整的系統(tǒng)架構(gòu),供參考,歡迎批評指正。
TDengine在數(shù)字治理系統(tǒng)中處理軌跡數(shù)據(jù)的應(yīng)用 - TDengine Database 時序數(shù)據(jù)庫

用戶直接交互的是應(yīng)用層,包含:瀏覽器的Web應(yīng)用、微信小程序或者Android平臺的App。其中Web應(yīng)用還與GIS系統(tǒng)進行交互獲取地圖瓦片和坐標(biāo)載入顯示等信息。支撐應(yīng)用層的是業(yè)務(wù)運算后臺服務(wù),包含用戶管理、權(quán)限管理、問題管理等業(yè)務(wù)運算。底層存儲使用了MySQL+ TDengine的配合。業(yè)務(wù)運算后臺還會與其他門戶數(shù)據(jù)中心的第三方服務(wù)進行交互,實現(xiàn)整個數(shù)字治理系統(tǒng)的各項需求。

底層數(shù)據(jù)存儲上的思考是這樣的。業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)需要大量賬號信息管理、關(guān)聯(lián)查詢、業(yè)務(wù)從屬處理,是典型關(guān)系數(shù)據(jù)庫應(yīng)用場景,因此這部分?jǐn)?shù)據(jù)存入MySQL;巡查坐標(biāo)數(shù)據(jù)是前文提到的海量時序位置信息,涉及更多的是按時間讀取數(shù)據(jù),按照賬號計算軌跡等,是典型的時序結(jié)構(gòu)化數(shù)據(jù)儲存分析場景,非常適合存入TDengine。這里把位置數(shù)據(jù)從原來的MySQL中摘出來后,通過一個坐標(biāo)計算微服務(wù)來轉(zhuǎn)存、計算巡查坐標(biāo)數(shù)據(jù),實現(xiàn)了原有的業(yè)務(wù)運算后臺與TDengine之間的交互,且不對原來的運算后臺產(chǎn)生大量代碼改動,非常方便。

數(shù)據(jù)模型

遵循一臺設(shè)備一張表的設(shè)計思路。在我們系統(tǒng)中是一個用戶一張表,用于記錄該用戶的所有歷史軌跡信息。所有子表都基于一個名為“super”的超級表創(chuàng)建,將設(shè)備ID定義成一個tag,用于對表進行區(qū)分。

快速開發(fā)

封裝好API,直接用Spring Boot調(diào)用JDBC來與TDengine數(shù)據(jù)源交互即可。下面的示例中,使用Spring Boot+TDengine實時存儲GPS坐標(biāo),實現(xiàn)過程非常的簡單。

第一步 在Linux上開啟TDengine服務(wù);

第二步?創(chuàng)建一個的Spring Boot項目,在application.properties中配置TDengine的連接信息(ps:端口默認(rèn)為0,用戶名默認(rèn)為root,密碼默認(rèn)為taosdata);

server.port=8085
server.servlet.context-path=/api

#taos
taosdata.url=jdbc:TAOS://192.168.1.241:0/db?user=root&password=taosdata
taosdata.driverClassName=com.taosdata.jdbc.TSDBDriver

第三步 在pom.xml中配置相關(guān)依賴,下載jar包;

<!-- taos Start -->
<dependency>
  <groupId>com.taosdata.jdbc</groupId>
  <artifactId>taos-jdbcdriver</artifactId>
  <version>1.0.1</version>
</dependency>
<!-- taos END -->

第四步 建立config文件,對應(yīng)application.properties中的url和driverClassName;

@Component
@ConfigurationProperties(prefix = “taosdata”)
public class TaosdataConfig {
  private String url;
  private String driverClassName;
  public String getUrl() { 
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  public String getDriverClassName() {
    return driverClassName;
  }
  public void setDriverClassName(String driverClassName) {
    this.driverClassName = driverClassName;
  }
}

第五步 實現(xiàn)相關(guān)業(yè)務(wù)邏輯(ps:與傳統(tǒng)關(guān)系型數(shù)據(jù)庫一樣,采用sql語法)。創(chuàng)建庫,建表,插入,查詢等操作在Java中實現(xiàn)如下。

建庫、建表:
String sql1 = “create database if not exists coor”;
stmt.executeUpdate(sql1);
String sql2 = “use coor”;
stmt.executeUpdate(sql2);
String sql3 = “create table if not exists super (ts timestamp, lng double, lat double) tags (id nchar(32))”;
stmt.executeUpdate(sql3);
String sql4 = “create table if not exists “ + (“u” + userid) + “using super tags(‘” + userid + “’)”;
stmt.executeUpdate(sql4);

插入數(shù)據(jù):
String sql5 = insert into “ + (“u” + userid) + “ values(“ + now.getTime()+”,” + lng + “,” + lat + “)”;
stmt.executeUpdate(sql5);

查詢:
StringBuilder sql6 = new StringBuilder(“select * from u”)
  .append(userid)
  .append(“ where ts>=’”)
  .append(stime)
  .append(“’ and ts <= ‘”)
  .append(etime)
  .append(“’”);
ResultSet resSet = stmt.executeQuery(sql6.toString());
Timestamp ts = null;
while(resSet.next()) {
  ts = resSet.getTimestamp(“ts”);
  lng = resSet.getDouble(“l(fā)ng”);
  lat = resSet.getDouble(“l(fā)at”);
  //業(yè)務(wù)處理略去…
}

總結(jié)

雅恒通過將網(wǎng)格巡查位置數(shù)據(jù)從關(guān)系庫MySQL轉(zhuǎn)存入時序庫TDengine后,解決了大數(shù)據(jù)量、長周期查詢時的性能和易用性問題,避免了分庫分表維護的麻煩。通過微服務(wù)的方式把TDengine集成進原有系統(tǒng),提供時序數(shù)據(jù)存儲和計算服務(wù),整體上對原有系統(tǒng)沖擊很小,遷移改造比較順利。數(shù)據(jù)壓縮率可能也是一個很有價值的考量目標(biāo)。后續(xù)也許會繼續(xù)查看TDengine自帶的流計算等功能,看是否能進一步減輕業(yè)務(wù)層的計算壓力,提高計算資源利用率。

作者簡介

黃勇,畢業(yè)于湖南工學(xué)院,從事Java開發(fā)工作多年,目前是雅恒核心研發(fā)成員。曾主持廣東省政法委基層網(wǎng)格化管理系統(tǒng)的開發(fā)工作,并深度參與過廣州市番禺區(qū)教育局教育信息素養(yǎng)提升平臺、海幢寺噪音監(jiān)測系統(tǒng)等系統(tǒng)工程的開發(fā)工作。

原文首發(fā)于雅恒科技公眾號,鏈接:https://mp.weixin.qq.com/s/qHQI9dRCc60NVdu3cJ-0kQ