基于Tablestore管理海量快递轨迹数据架构实现

快递轨迹管理

对于一个快递公司,在全国范围内有着大量的快递点、快递员、运输车辆以及仓储中心。而快递自产生后,就会在这些地点、人物之间流转。因而,一套完善的快递管理追踪系统是快递公司的重要管理工具;

用户通过平台客户端下单后,产生唯一的快递单号作为唯一身份标识。快递除了订单号,还会有很多属性信息,如:邮寄人、邮寄人手机、邮寄人地址、收件人、快递类型等信息。生成快递订单后,用户的邮寄物品才会成为“快递”。快递公司配合扫码机器,将快递的流转事件、地点、时间等信息不定期推送至系统。快递流转信息不仅可以是简单的量化数据,也可以是描述性文字、地理位置等特殊信息。系统将流转信息记录成快递的监控数据,同时修改快递状态、实时位置等。直至快递送达收件人手中,结束快递生命周期。

通过系统,用户可以管理自己的历史邮寄单列表、收件列表,掌握自己邮寄中的快递轨迹。快递公司也可以查询、修改快递信息、追踪快递时效,并借助海量轨迹监控数据,掌握快递产生、收件的高频路线,在高频位置铺设更多的基础设施、转移调度快递员;

功能需求

面向用户:

1、用户在线下单生成快递单,等候快递员上门取件;
2、管理历史订单列表,了解快递明细;
3、追踪特定快递周转状态、运送轨迹;

面向平台:

1、借助扫码器,实现快递周转事件采集、存储;
2、统计、查询所有快递订单,实现全订单的管理:CRUD;
3、掌握所有邮寄中快递的实时位置;
4、掌握任意一个订单的周转状态、运送轨迹;
5、基于历史快递数据,分析快递时效;
6、方便掌握高频地域、路线,为增设基础设施、快递员提供依据;
等等...

系统样例,如下所示:官网控制台地址:项目样例

实现方案

MySQL方案与难点

通常,用户会选用MySQL作为方案数据库,因为MySQL作为数库在查询、分析等功能上有优势,用户创建两个表:订单表、事件追踪表实现对快递数据的存储。

但是快递场景有几个强需求:
第一、需要有强大的查询、统计能力,实现快递单的管理;
第二、对于海量快递,有着高并发写入需求,对写入性能要求较高;
第三、数据持续膨胀,但历史快递订单、事件数据多为冷数据,存储成本需要尽可能低;
第四、数据未来挖掘潜在价值较高,需要有较好的计算生态;

而MySQL方案在面对第二、第三个强需求时,劣势凸显,海量并发、不断的数据膨胀、存储成本高一直以来都是关系型数据库的痛点;

表格存储方案

选择表格存储有以下优势:

其一、表格存储的多元索引(SearchIndex)功能轻松满足用户的多维查询、GEO检索、统计等功能需求;
其二、基于LSM tree打造的分布式NoSQL数据库,轻松支持海量高并发读、写,零运维轻松应对数据量的不断膨胀,理论上无上限。
其三、表格存储按量计费,提供容量型、高性能型两种实例,容量型对冷数据更适宜,提供了更低存储成本。
其四、更重要的,表格存储拥有较为完善的计算生态,提供全、增量通道服务,提供流计算、批计算一体的计算体系,对未来监控数据价值挖掘提供渠道。

表格存储在时序场景需求的技术点上拥有极高的匹配,而基于时序场景打造的Timestream模型更是将时序场景通用功能,封装成易用的场景接口,使用户更容易的基于表格存储,根据自身需求设计、打造不同特点的轨迹追踪系统;

数据结构设计

基于快递的时序,将快递的属性信息作为meta数据,而快递的周转路径、状态、位置等则为data数据,下面对两类数据做简单介绍。

快递元数据

meta数据管理着快递的属性信息,支持指标、标签、属性、地理位置、更新时间等参数,模型会为所有属性创建相应的索引,提供多维度条件组合查询(包含GEO查询)。其中Identifier是时间线的标识,包含两部分:name部分(监控指标标识)、tags部分(固有不可变参数集合)。

在快递场景中,用户通常是基于快递单号直接定位快递,因而tags使用空的。而属性信息则存储快递的邮寄人信息、收件人信息、邮寄起/止地址等,location字段,用于最新位置追踪,可不定期根据产生新的状态周转数据时更新。

快递轨迹数据

data数据记录着快递的状态周转信息,主要为量化数据、地理位置、文字表述等任意类型。data数据按照+有序排列,因而同一快递的所有数据物理上存在一起,且基于时间有序。这种数据存储方式,极大的提升了时间线的查询效率。对应到快递轨迹,监控数据主要记录了:【who】do【something】@【where】with the location【geo】以及联系方式等。

读写接口使用介绍

写数据

写接口根据数据类型分为两类:meta写入(新增快递)、data写入(快递周转数据)

  • 新增快递:当用户通过系统直接下快递单后,产生唯一订单号,加上用户填写的快递单信息组成必要的凯迪数据。此时,就会生成一个时间线,产生一个meta数据;
  • 快递周转:当快递发生取件、运输周转、派送、取件是,产生的状态转变数据时,就会产生一条追踪数据,通过data数据的写接口不定期的写入;

读数据

与写数据一样,针对两类数据提供了两类读接口:meta读取(快递查询)、data读取(查询快递轨迹)

  • 查询快递:根据快递号、寄件人手机、收件人手机等信息,获取对应快递的列表,掌握所有快递的最新动态;
  • 查询快递轨迹:基于单个meta的Identifier,获取该快递从产生到结束整个生命周期内的轨迹周转数据,可以通过列表、地图轨迹展示等方式,直观的了解快递的周转过程;

方案核心代码

SDK与样例代码

SDK使用:
时序模型Timestream模型集成于表格存储的SDK中,目前已在4.11.0版本中支持;

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

代码开源:
https://github.com/aliyun/tablestore-examples/tree/master/demos/MailManagement

建表准备

在创建完成实例后,用户需要通过时序模型的sdk创建相应的meta表(快递元数据)、data表(快递周转数据):

private void init() {AsyncClient asyncClient = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instance);//快递抽象TimestreamTimestreamDBConfiguration mailConf = new TimestreamDBConfiguration("metaTableName");mailDb = new TimestreamDBClient(asyncClient, mailConf);
}public void createTable() {mailDb.createMetaTable(Arrays.asList(//自定义索引new AttributeIndexSchema("fromMobile", AttributeIndexSchema.Type.KEYWORD),new AttributeIndexSchema("fromName", AttributeIndexSchema.Type.KEYWORD),new AttributeIndexSchema("toMobile", AttributeIndexSchema.Type.KEYWORD),new AttributeIndexSchema("toName", AttributeIndexSchema.Type.KEYWORD),new AttributeIndexSchema("toLocation", AttributeIndexSchema.Type.GEO_POINT)));mailDb.createDataTable("dataTableName");
}

写数据

数据写入主要分两部分,meta表创建新快递、data表采集快递周转信息

创建快递单(meta表写入)

//metaWriter对应meta表,提供读、写接口
TimestreamMetaTable mailMetaWriter = mailDb.metaTable();//identifier作为时间线的身份标识(unique),仅含:快递单号ID,
TimestreamIdentifier identifier = new TimestreamIdentifier.Builder("mail-id-001").build();//基于identifier创建meta对象,并为meta设置更多属性,Attributes为属性参数
TimestreamMeta meta = new TimestreamMeta(identifier).addAttribute("fromName", whos.get(Rand.nextInt(whos.size()))).addAttribute("fromMobile", "15812345678").addAttribute("toName", whos.get(Rand.nextInt(whos.size()))).addAttribute("toMobile", "15812345678").addAttribute("toLocation", "30,120");//创建新的时间线,然后写入监控数据
mailMetaWriter.put(meta);

采集快递周转事件(data表写入)

//dataWriter分别对应data表,提供读、写接口
TimestreamDataTable mailDataWriter = mailDb.dataTable("mailDataTableName");
TimestreamMeta meta;//meta上一步已经构建//创建新的时间线,然后写入监控数据
mailDataWriter.write(meta.getIdentifier(),new Point.Builder(14500000000, TimeUnit.MILLISECONDS).addField("who", "张三").addField("do", "取件").addField("where", "云栖小镇").addField("location", "30,120").build()
);

数据读取

数据读取分为两类:

快递订单多维查询(meta表读取)

//reader对应meta表,提供读、写接口,此处名字为突出读功能
TimestreamMetaTable metaReader = mailDb.metaTable();//构建筛选条件
Filter filter = AndFilter(Name.equal("mail-id-001"),Attribute.equal("fromMobile", "15812345678")
);Iterator<TimestreamMeta> metaIterator = mailDb.metaTable().filter(filter).fetchAll();while (iterator.hasNext()) {TimestreamMeta meta = iterator.next();//deal with metas
}

快递轨迹追踪(data表读取)

//dataWriter分别对应data表,提供读、写接口
TimestreamDataTable dataReader = db.dataTable("dataTableName");
TimestreamMeta meta;//基于已获取的meta列表,分别获取每个快递的轨迹追踪Iterator<Point> dataIterator = mailDb.dataTable(mailDataTableName).get(meta.getIdentifier()).fetchAll();while (iterator.hasNext()) {Point point = iterator.next();//deal with pointslong timestamp = point.getTimestamp(TimeUnit.MILLISECONDS);//毫秒单位时间戳String location = point.getField("location").asString();//获取该点String类型的位置信息
}


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

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

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

相关文章

完了!Python黄了! 80%的程序员:痛快!你怎么看?

Python真的万能语言&#xff1f;在我的一个朋友看来&#xff0c;他坚信 Python 可以做任何事情。其实我是不服的&#xff0c;因为我在某网站看到有条评论&#xff1a;Python将要黄了&#xff01;事实究竟如何&#xff1f;这篇文章会揭开这个黑幕&#xff0c;让程序员看清现实&a…

趣谈预留实例券,一文搞懂云上省钱最新玩法

ECS近期推出了预留实例券&#xff08;Reserved Instances&#xff09;&#xff0c;简称RI&#xff0c;这东西很cool&#xff0c;今天我们聊聊这个。 首先这篇Blog不是文档&#xff0c;读完后想详细了解文档的朋友请点击 一个小故事 我来给大家讲一个故事理解云上的几种付费方…

到底什么是空指针?如何避免空指针_01

文章目录1. 场景案例2. 针对于空指针的场景&#xff0c;有哪些方式可以避免问题1. 场景案例 package com.gblfy;import org.springframework.beans.factory.annotation.Autowired;import javax.servlet.http.HttpServletRequest;/*** 理解什么是空指针*/ public class WhatIsn…

在 IntelliJ IDEA 中部署应用到服务器(Eclipse)

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去&#xff0c;有些读者反馈目前还有一些测试机器是在经典网络&#xff0c;甚至是在本地机房中&#xff0c;咨询是否可以通过 Cloud Toolkit 插件将应用部署到这…

linux所有文件打包压缩,Linux基础教程:对文件打包压缩

一、须知文件数量太多&#xff0c; 如果需要拷来拷去是不是很麻烦&#xff1f; 怎么办&#xff1f; 打包&#xff01;文件太大&#xff0c;通过网络下载、传输会不会很费时间&#xff1f; 怎么办&#xff1f; 压缩&#xff01;在Linux环境中&#xff0c;打包压缩文件的…

钉钉平台助力中国一汽疫情防控 数字化迈入新阶段

面对突如其来的疫情&#xff0c;中国一汽紧急应对、快速响应&#xff0c;携旗下一汽-大众、一汽丰田捐赠资金8100万元&#xff0c;并成立了疫情防控专项基金。同时&#xff0c;通过旗下“一汽出行”公司组织 “特别爱心车队”&#xff0c;在抗击疫情期间&#xff0c;提供安全、…

阿里靠什么支撑 EB 级计算力?

阿里妹导读&#xff1a;MaxCompute 是阿里EB级计算平台&#xff0c;经过十年磨砺&#xff0c;它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute 做了哪些工作&#xff0c;这些工作背后的原因是什么&#xff1f;大数据市场进入普惠红海的新阶段&a…

为什么说流处理即未来?

本文整理自 Flink 创始公司 Ververica 联合创始人兼 CTO - Stephan Ewen 在 Flink Forward China 2018 上的演讲《Stream Processing takes on Everything》。 这个演讲主题看似比较激进&#xff1a;流处理解决所有问题。很多人对于 Flink 可能还停留在最初的认知&#xff0c;…

别再用那些已经淘汰的技术了!2020 年 9 大顶级 Java 框架出炉!!

来源 | Patricia Neil责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;顶级Java框架#1&#xff1a;Spring顶级Java框架#2&#xff1a;Hibernate顶级Java框架#3&#xff1a;Struts顶级Java框架#4&#xff1a;Play顶级Java框架#5&#xff1a;Googl…

字符串、数组、集合在使用时出现空指针怎么办?_03

文章目录1. 寻找代码案例中出错的场景2. 案例1. 寻找代码案例中出错的场景 字符串使用equals时报空指针错误 对象数组最燃new出来了&#xff0c;但是如果没有初始化&#xff0c;一样会报空指针错误 List对象add null不报错&#xff0c;但是addAll 不能添加null&#xff0c;否则…

云原生时代来袭 下一代云数据库技术将走向何方?

全面云化的时代已经到来&#xff0c;面对一系列的新技术和挑战&#xff0c;数据库市场将面临怎样的变革&#xff1f;作为云服务提供商&#xff0c;如何帮助更多的企业级用户把握“云”潮&#xff0c;提供最高效、最具价值的数据库解决方案&#xff1f; 日前&#xff0c;在阿里…

直播连麦贾扬清,谈谈他所理解的四大 AI 落地问题 | 攻“疫”技术公开课

从机器学习模型的层次来看&#xff0c;大致经历了两次发展浪潮&#xff1a;浅层学习&#xff08;Shallow Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;。1980年代&#xff0c;人工神经网络的反向传播算法&#xff08;也叫Back Propagation算法或者BP算…

linux区分用户的权限级别可用,Linux用户及权限管理

基本操作首选我们梳理一下 Linux 下的用户、用户组、文件权限等基本知识&#xff0c;然后后面通过一个案例来实际演示一下权限设置的一些操作。首先 Linux 系统中&#xff0c;是有用户和用户组的概念的&#xff0c;用户就是身份的象征&#xff0c;我们必须以某一个用户身份来操…

别人家的工程师:阿里巴巴工程师有了新帮手,AI可帮助修Bug

尽管工程师用代码创造了AI&#xff0c;但AI又可以对这些代码点评一番、甚至修复Bug&#xff0c;工程师和AI的关系正在变得微妙。 AI评委引热议&#xff0c;阿里巴巴表示&#xff1a;AI不会取代工程师 4月18日&#xff0c;2019阿里巴巴研发效能峰会——“83行代码挑战赛”决赛…

31岁,年薪33万:“谢谢今天裁掉我” !有底气的人生无需解释!

最近脉脉一则帖子炸锅了&#xff1a;某HR发帖称公司以按时下班为由裁员。这种情况下很多人都慌了&#xff0c;大家纷纷把“副业救国”奉为神律。可是你有没有认真的想过&#xff0c;为什么现在大家都需要副业&#xff1a;意外裁员后&#xff0c;房贷能够按时还上不至于“回收”…

linux脚本语言求累加和,Linux Shell脚本语言与数学表达式

当你理解了Shell脚本&#xff0c;每当需要时都能流畅编写时&#xff0c;那种感觉很爽的。本章中&#xff0c;我们将教你用脚本语言进行比较复杂的数学运算。让我们从斐波那契数列开始吧。斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;0…

你应该知道的 HBase 基础,都在这儿了

阿里妹导读&#xff1a;2006 年10 月Google 发布三架马车之一的《Bigtable&#xff1a;A Distributed Storage System for Strctured Data》论文之后&#xff0c;Powerset 公司就宣布 HBase 在 Hadoop 项目中成立&#xff0c;作为子项目存在。后来&#xff0c;在2010 年左右逐渐…

一文读懂Docker及其对系统管理员的重要性

作者 | Damian Perera编译 | 火火酱&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;自从Docker在2013年初上线以来&#xff0c;就与程序员及系统管理员之间产生了一种爱恨交加的奇妙关系。虽然与我交谈过的一些经验丰富的的开发人员…

主流微服务注册中心浅析和对比

开源产品受开发者热捧&#xff0c;是因为其代码透明、可以参与共建、有社区进行交流和学习&#xff0c;当然更重要的是开源产品的接入成本低。个人开发者或者中小型公司往往会将开源产品作为选型首选。 开发者通过阅读源代码&#xff0c;理解产品的功能设计和架构设计&#xf…

linux内核重要结构体,Linux中list_head结构体相关 | 技术部落

在Linux内核中&#xff0c;提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的&#xff0c;但是list_head的引入&#xff0c;使得内核数据结构也可以拥有面向对象的特性&#xff0c;通过使用操作list_head 的通用接口很容易实现代码的重用&#xff0…