Timestream开发最佳实践

背景

Timestream模型是针对时序场景设计的特有模型,可以让用户快速完成业务代码的开发,实现相关业务需求。但是,如果业务系统不仅想实现基础的相关业务功能,还要达到最佳的性能,并且兼顾到未来的扩展性的话,就不是一件特别容易的事情。

本文会以共享汽车管理平台为例,介绍一系列的timestream最佳设计和使用,给业务设计和使用提供一些参考。

场景和模型简介

在共享汽车管理平台这个场景中,主要是对车辆的状态轨迹监控、车俩元数据以及订单元数据进行管理。另外,还会对相关的数据进行计算分析并存储相关结果:

  • 车辆状态轨迹:记录了车辆的状态监控,比如车速、位置、续航等数据,另外还需要记录车辆行驶过程中的违章记录,比如:是否超速、是否闯红灯等等;
  • 车辆元数据:记录车辆的基本属性信息,便于用户进行车辆检索,比如:车型、车牌、颜色等;
  • 订单元数据:订单相关信息记录,包含行程的起止时间、车辆、用户、费用等信息

业务主要是对上面三部分数据进行查询和检索,满足业务场景的需求。其中车辆元数据以及状态轨迹数据是典型的时序序列,可以很方便的映射到Timestream模型中。

下图是数据模型的映射:

下面介绍一下模型设计的细节以及设计中需要注意的一些优化点,这些优化点对于业务功能以及性能上都有一定的提升。

业务模型设计

在Timestream模型中,主要包含了元数据和数据点两部分数据,分别使用一个元数据表以及若干个数据表进行存储。下面介绍这两类数据在存储设计的关键点。

元数据表设计

在共享汽车这个场景下,元数据表主要存储两类数据:车辆的基本信息、车辆的最近状态数据(位置、续航、状态、违章统计等),业务会根据各类信息进行多条件的组合查询符合条件的车辆。

如上图所示,Timestream的元数据表会通过多元索引来提供丰富的数据检索能力。在Timestream模型的元数据中,包含了name、tags、attributes三类数据,其中name、tags默认会提供数据检索能力,attributes则需要在创建Meta表的时候指定需要索引的attributes字段以及相关信息,默认attributes并不支持检索。
需要注意的是,目前并不支持动态修改Meta表的索引字段,所以最好能在设计之初能够考虑到当前以及未来的功能需求,下面介绍一下相关信息是如何映射到模型以及相关的设计。

name设计

name字段的选取是很关键的,是数据检索性能的一个重要影响因素,不同的name字段设计可能会导致查询延时相差一个数量级。name字段的选取建议满足以下条件:

  • 绝大多数查询场景都会对该字段进行精确查询
  • 该字段单个取值下的最大记录数不宜过多,比如说不超过一千万条记录

在共享汽车管理平台这个场景下,管理的是各个平台的车辆,而在车辆检索的时候,一定会指定的条件是平台的名字,并且某个平台的车辆其实也不会太多,一般也就百万量级,所以这里可以将平台作为name。

tags设计

在Timestream模型中,Name和Tags可以唯一确定某个元数据,在这个场景中,唯一确定某辆车的信息是:平台、车辆ID,其中平台是name,所以,tags中只需要存储ID即可。
tags设计需要注意:

  • tags的总长度尽可能的短,只把唯一确定主体的信息放到tag中,其余信息均放到attributes中
  • tag只支持string类型的数据,如果业务字段是数值类型,需要将其转成string进行存储

attributes设计

attributes是主体的可变属性,也可以用来存储主体的非唯一属性。在这个场景中,车辆的基本信息以及当前状态都是用attributes来进行存储。attributes设计关键点:

  • 创建meta表的时候需要指定有检索需求的attributes以及相关属性,默认attributes是不支持索引的
  • 数值型数据尽可能使用int来存储,attribute支持多类型的数据,但在数据检索过程中,int类型的数据检索效率比string类型高的多,建议使用int,索引类型为LONG
  • 考虑未来系统的扩展性,可以预留一列作为扩展字段,索引类型为KEYWORD,并且是Array

索引创建示例代码:

public void createMetaTable() {db.createMetaTable(Arrays.asList(new AttributeIndexSchema("地区", AttributeIndexSchema.Type.KEYWORD),...// 数值类型索引new AttributeIndexSchema("座位", AttributeIndexSchema.Type.LONG), ...// 扩展字段,数组类型索引new AttributeIndexSchema("配置1", AttributeIndexSchema.Type.KEYWORD).isArray()  ));

数据表设计

Timestream可以支持多个数据表的存储,来满足不同的业务场景需求。另外,为了能够利用底层引擎所做的性能优化,我们推荐append的写入方式,即不会对已有数据进行修改,所以在以下场景中,我们建议业务将数据分到不同数据表中进行存储:

  • 数据精度不同,特别是在监控场景下,这个需求更加突出。按数据精度分表便于后续数据的查询,如果查询长周期的数据可以去查询低精度的表,减少查询的数据量,提高查询效率
  • 需要对数据进行加工处理,也就是会对数据进行更新,建议将处理之后的数据写到另外一张表中

在共享汽车这个场景中,需要对车辆的状态轨迹数据进行流式处理,比如检测是否超速等违章、车辆状态轨迹是否异常等,然后将处理之后的数据写到另外一张表中,提供给业务进行查询。

sdk使用

前面介绍了业务模型设计需要注意的地方,对业务功能拓展能力以及性能都有一定的提升。下面介绍一下timestream sdk使用的一些性能优化点。

数据写入

元数据

元数据写入支持两种方式:put和update。其中put会删除老的记录,并且插入一个全新行;update则是对原有记录的部分attributes进行更新。建议尽量使用Put的方式进行写入。
示例代码:

public void writeMeta() {TimestreamIdentifier identifier = new TimestreamIdentifier.Builder("*滴").addTag("ID", carNo).build();TimestreamMeta meta = new TimestreamMeta(identifier).addAttribute("地区", "杭州").addAttribute("座位", 4)....addAttribute("状态", "闲置");// 插入车辆信息metaWriter.put(meta);
}

数据点

数据点写入也提供了两种方式:同步和异步。其中异步接口底层是通过TableStoreWriter进行异步写入,其写入吞吐能力更高,对写入延时不是特别敏感的业务建议使用异步方式。
示例代码:

public void writeData() {TimestreamIdentifier identifier = new TimestreamIdentifier.Builder("*滴").addTag("ID", carNo).build();Point point = new Point.Builder(1546272000, TimeUnit.SECONDS).addField("位置", "30.1457580736,120.0563192368").addField("车速", 30).addField("续航", 100).build();// 异步写入dataWriter.asyncWrite(identifier, point);
}

数据查询

元数据查询

元数据查询的时候,建议指定需要返回的列名。如果没有显示指定列名的话,会去读主表以获取完整的信息,这样每一行元数据都会反查一次主表,查询性能会更差一些。
示例代码:

Filter filter = Name.equal("*滴");// 用selectAttributes指定需要返回的attributes
Iterator<TimestreamMeta> iter = metaTable.filter(filter).selectAttributes("座位", "状态").fetchAll();

总结

本文介绍了Tablestore Timestream在模型设计以及sdk使用中的一些优化点,对于业务现有功能实现、未来拓展以及性能提升都有很好的作用

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux-ubuntu-16.04 安装系统、安装 SSH 服务、设置root用户密码

1、ubuntu-16.04安装 使用UltraISO 软碟通 将 ubuntu-16.04-desktop-amd64.iso 制作为U盘镜像插入U盘&#xff0c;开机按F12选择U盘启动安装过程参考 https://blog.csdn.net/weixin_59605625/article/details/125807363 2、ubuntu-16.04 安装 SSH 服务 $ 在linux中代表普通用…

Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use.

文章目录一、现象二、解决方案一、现象 [rootlocalhost app]# docker run -p 8080:8080 -p 9326:9326 --name eblog --link es_643:ees --link myrabbit:erabbit --link mymysql:emysql --link myredis:eredis -d eblog:1.0a74c2caaca88203c1ca575cd2f8a0e0426d892d5800c487…

助力企业应用与基础架构现代化 VMware这波组合拳够强!

顺应时代的发展&#xff0c;“数字化转型”已经成为企业发展的必由之路。应用作为数字化转型的核心&#xff0c;能够帮助企业向客户提供定制化的数字化体验&#xff0c;创造新的收入来源。在数字化转型道路上&#xff0c;中国企业走的并不慢甚至非常之快&#xff0c;在此过程中…

应用架构的核心使命是什么?阿里高级技术专家这样说

阿里妹导读&#xff1a;什么是架构&#xff1f;关于架构这个概念很难给出一个明确的定义&#xff0c;也没有一个标准的定义。如果&#xff0c;硬是要给一个概述&#xff0c;阿里巴巴高级技术专家张建飞认为架构就是对系统中的实体以及实体之间的关系所进行的抽象描述。今天&…

2分钟学会Docker部署SpringBoot项目

文章目录一、安装docker1. 在线安装docker2. 换镜像源二、安装redis三、安装mysql四、安装RabbitMq五、安装ElasticSearch5.1. 修改服务器配置5.2. 创建容器并启动 ES5.3. 查看启动日志5.4. 进入镜像5.5. 修改cluster-name5.6. 安装中文分词插件5.7. 退出并重启镜像5.8. 查看启…

linux-ubuntu-16.04 安装 java8、 firewalld、 mysql5.7、Redis 5.0.3、FastDFS、nginx1.18

1、安装java 新建jdk目录 cd /usr/local mkdir java下载JDK8上传到java目录下&#xff0c;解压文件 cd java tar -zxvf jdk-8u201-linux-x64.tar.gz链接&#xff1a;https://pan.baidu.com/s/155P1Y5YetBD0E4PhcPgNfg 提取码&#xff1a;z27j 配置环境变量 vi /etc/profi…

K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)

导读&#xff1a;Kubernetes 作为云原生时代的“操作系统”&#xff0c;熟悉和使用它是每名用户的必备技能。本篇文章概述了容器服务 Kubernetes 的知识图谱&#xff0c;部分内容参考了网上的知识图谱&#xff0c;旨在帮助用户更好的了解 K8s 的相关知识。 1. 概述 容器服务 …

利用 Docker 在不同宿主机做 CentOS 系统容器 | 原力计划

作者 | 于先森2017责编 | 伍杏玲出品 | CSDN博客最近公司新接到一个项目&#xff0c;惯例是通过技术架构、业务需求、用户量还有以往的经验大概评估出一份资源配置表格提供给客户&#xff0c;让客户参考采购的服务器资源。但这次客户根本没有根据我们提供的参考表格来&#xff…

编程界的“二向箔”——Dart元编程

阅读过《三体》的同学肯定知道“降维打击”&#xff0c;从更高维度看问题&#xff0c;直接将对手KO。今天我们闲聊一下编程界的“二向箔”——元编程。 1. 什么是元编程 我们听过了太多太多的名词&#xff0c;耳朵似乎都有点名词麻痹症了。比如&#xff0c;有些名词为了装x&a…

在线安装docker

文章目录一、安装docker1. 在线安装docker2. 换镜像源一、安装docker 1. 在线安装docker #安装 yum install docker#检验安装是否成功 [rootlocalhost opt]# docker --version Docker version 1.13.1, build 7f2769b/1.13.12. 换镜像源 sudo vim /etc/docker/daemon.json 内…

linux-ubuntu-22.04 安装 java8、 firewalld、 mysql5.7、Redis 6.0、FastDFS、nginx1.18

1、安装java 可参考ubuntu-16.04&#xff0c;没区别 https://blog.csdn.net/qq_38959934/article/details/126101028 2、安装 firewalld 可参考ubuntu-16.04&#xff0c;没区别 https://blog.csdn.net/qq_38959934/article/details/126101028 3、安装 mysql5.7 apt-get in…

车联网服务non-RESTful架构改造实践

导读 在构建面向企业项目、多端的内容聚合类在线服务API设计的过程中&#xff0c;由于其定制特点&#xff0c;采用常规的restful开发模式&#xff0c;通常会导致大量雷同API重复开发的窘境&#xff0c;本文介绍一种GraphQL查询语言网关编排联合的实践&#xff0c;解决大量重复…

为什么铺天盖地都是 Python 的广告?

最近&#xff0c;知乎关于Python有一个热议问题&#xff1a; 甚至在抖音上&#xff0c;笔者有一次还看到Python占领了热搜&#xff01;应该有很多不懂技术的吃瓜群众也被Python的热度炒懵了……但是&#xff0c;Python真的值得学吗&#xff1f;真的值得花这么多钱去学吗&#x…

Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了

阿里妹导读&#xff1a;一年多前&#xff0c;Java 界最近发生了一件大事&#xff0c;阿里开源 Spring Cloud Alibaba&#xff0c;并推出首个预览版。Spring Cloud 本身是一套微服务规范&#xff0c;并不是一个拿来即可用的框架&#xff0c;而 Spring Cloud Alibaba 的开源为开发…

一个系统,搞定闲鱼服务端复杂问题告警-定位-快速处理

服务端问题排查对开发而言是家常便饭&#xff0c;问题并不可怕但要花大量时间去处理&#xff1b;另一方面故障的快速解决至关重要。 目前问题排查最大的障碍是什么呢&#xff1f;我们认为有以下几个原因&#xff1a; 大量的告警信息。链路的复杂性。排查过程繁复。依赖经验。…

Bespin Global荣膺“Gartner2020全球公有云基础设施管理服务提供商魔力象限领导者”

近日&#xff0c;国际权威调研机构Gartner发布了《2020全球公有云基础设施管理服务提供商魔力象限》报告&#xff0c;Bespin Global&#xff08;贝斯平&#xff09;被评为行业领导者&#xff0c;成为东亚唯一连续四年入选Gartner云MSP魔力象限以及东亚唯一进入领导者象限的科技…

Gartner:2019年公有云服务六大趋势

作系&#xff1a;Gartner杰出研究副总裁Ed Anderson、Gartner研究副总裁David Ackerman、Gartner研究副总裁Sid Nag、Gartner高级研究总监吴涛 在2017年至2018年间&#xff0c;云服务市场发生了巨大的变化。企业机构从低风险地尝试使用云转向全面、大规模地使用云。云项目已进入…

大促背后的流量利器|手淘push升级 比你更懂你

导读&#xff1a;过去的很长一段时间内&#xff0c;由于电商的强运营特性&#xff0c;手淘 App 的 Push 消息大部分时候是作为一个活动通知的通道&#xff0c;对重要活动进行通投引流。然而在竞争环境更加激烈和用户渗透日趋饱和的今天&#xff0c;具备更加精细化的用户运营手段…

京东发布“下一代智能协同开放平台”战略 助力政企数字化转型

5月7日,“下一代智能协同开放平台产业战略发布会”(以下简称“发布会”)在京召开。北京市海淀区委常委、常务副区长李俊杰,京东集团技术委员会主席、京东智联云总裁周伯文博士,以及中关村管委会等政府部门,金山、金蝶、致远互联、今目标、网易有道、稻壳互联等企业代表出席。为…

一行命令导致的数据丢失,阿里工程师是如何恢复的?

阿里妹导读&#xff1a;数据安全性被提到了前所未有的高度&#xff0c;数据保护的话题越来越成为敏感。因为&#xff0c;业务的中断时间对用户造成的影响愈来愈大。阿里技术专家凡钧从数据安全的形势与发展&#xff0c;面临的挑战&#xff0c;问题的定义&#xff0c;传统的解决…