基于TableStore的亿级订单管理解决方案

一、方案背景

订单系统存在于各行各业,如电商订单、银行流水、运营商话费账单等,是一个非常广泛、通用的系统。对于这类系统,在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大。数据的重视程度与数据规模的膨胀带来了新的挑战。

需求场景

某电商平台A,需要进行持久化所有平台产生的订单数据。同时,基于所有的订单数据,系统又需要向外提供面向多种角色:消费者、店家、平台三类人群的多元化的查询服务。消费者可以查询自己的历史订单,商家可以统计热销产品,平台也可以分析用户行为、平台交易规模等。主要查询方式涵盖订单的多维度检索,以及订单数据的分析、统计等,例如:
面向消费者:【A消费者】*【近1年】*【卖出电脑】订单查询;
面向售货员:【B售货员】*【近1个月】销售订单;
......

技术点

在订单场景中,技术上通常需要考虑的技术点,主要包含如下几个方面:

  • 查询能力:需要具备丰富的查询类型,如多维度、范围、模糊查询等,同时具备排序、统计等功能;
  • 数据量:存储海量数据的同时,满足强一致、高可用、低成本等要求;
  • 服务性能:应对高并发请求高并发的同时,保证低延迟;

实现多维、实时查询功能,是订单管理解决方案的核心功能。
testRecord

二、方案演进

应对订单场景,电商通常会采用MySQL传统方案。借助关系型数据库强大的查询能力,用户可直接通过SQL语句实现订单数据的多维度查询、数据统计等。所谓数据膨胀,分为横向、纵向两种,横向即不断迭代引入的新字段维度,纵向即总的存储数据量。在面对这两种订单数据膨胀上,单MySql方案逐渐变得吃力。 SQL + NoSQL的组合方案(以下称:组合方案)便应运而生,借助两个数据库各自的优势分别解决不同场景各自的需求。但组合方案同样也带来了新的问题,组合方案牺牲空间成本,同时也增加了开发工作量与运维复杂度。在保证数据一致性上产生额外开销。
下面让我们看一下如下几个常规方案:

常规方案

1、MySql分库分表方案

MySql自身拥有强大的数据查询、分析功能,基于MyQql创建订单系统,可以应对订单数据多维查询、统计场景。伴随着订单数据量的增加,用户会采取分库、分表方案应对,通过这种伪分布式方案,解决数据膨胀带来的问题。但数据一旦达到瓶颈,便需要重新创建更大规模的分库+数据的全量迁移,麻烦就会不断出现。数据迭代、膨胀带来的困扰,是MySql方案难于逾越的。仅仅依靠MySql的传统订单方案短板凸显。
1、数据纵向(数据规模)膨胀:采用分库分表方案,MySql在部署时需要预估分库规模,数据量一旦达到上限后,重新部署并做数据全量迁移;
2、数据横向(字段维度)膨胀:schema需预定义,迭代新增新字段变更复杂。而维度到达一定量后影响数据库性能;

2、MySql+HBase方案

引入双数据的方案应运而生,通过实时数据、历史数据分存的方案,可以一定程度解决数据量膨胀问题。该方案将数据归类成两部分存储:实时数据、历史数据。同时通过数据同步服务,将过期数据同步至历史数据。
1、实时订单数据(例如:近3个月的订单):将实时订单存入MySql数据库。实时订单的总量膨胀的速度得到了限制,同时保证了实时数据的多维查询、分析能力;
2、历史订单数据(例如:3个月以前的订单):将历史订单数据存入HBase,借助于HBase这一分布式NoSql数据库,有效应对了订单数据膨胀困扰。也保证了历史订单数据的持久化;
但是,该方案牺牲了历史订单数据对用户、商家、平台的使用价值,假设了历史数据的需求频率极低。但是一旦有需求,便需要全表扫描,查询速度慢、IO成本很高。而维护数据同步又带来了数据一致性、同步运维成本飙升等难题;

3、MySql+Elasticsearch方案

组合方案还有MySql+Elasticsearch,该方案同样是将数据分两部分存储,可以一定程度解决订单索引维度增长问题。用户自己维护数据同步服务,保证两部分数据的一致性;
1、全量数据:将全量的订单数据存入MySql数据库,订单ID之外的数据整体存为一个字段。该全量数据作为持久化存储,也用于非索引字段的反查;
2、查询数据:仅将需要检索的字段存入Elasticsearch(基于Lucene分布式索引数据库),借助于Elasticsearch的索引能力,提供可以应付维度膨胀的订单数据,然后必要时反查MySql获取订单完整信息;
该方案应付了数据维度膨胀带来的困扰,但是随着订单量的不断膨胀,MySql扩展性差的问题再次暴露出来。同时数据同步至Elasticsearch的方案,开发、运维成本很高,方案选择也存在弊端。

能力分析MySqlHBaseElasticsearchTableStore
存储方式行存储列存储索引存储列存储+索引存储
扩展性单机、扩展性差水平扩展水平扩展(自动)水平扩展
一致性强一致性强一致性、时序一致性 强一致性、时序一致性
检索较弱的支持不支持支持支持
数据量~ 1T,~亿行~10 PB,~万亿行~1 PB,~千亿行~10 PB,~万亿行

表格存储(TableStore)方案

如果使用表格存储(TableStore)研发的多元索引(SearchIndex)方案,则可以完美地解决亿量级订单系统问题。TableStore具有即开即用,按量收费等特点。多元索引随时创建,是海量电商订单元数据管理的优质方案。
TableStore作为阿里云提供的一款全托管、分布式NoSql型数据存储服务,具有【海量数据存储】、【热点数据自动分片】、【海量数据多维检索】等功能,天然地解决了订单数据大爆炸这一挑战;
同时,SearchIndex功能在保证用户数据高可用的基础上,提供了数据多维度搜索、统计等能力。针对多种场景创建多种索引,实现多种模式的检索。用户可以仅在需要的时候创建、开通索引。由TableStore来保证数据同步的一致性,这极大的降低了用户的方案设计、服务运维、代码开发等工作量。

基于表格存储搭建的订单系统页面一览

样例内嵌在表格存储控制台中,用户可登录控制台体验系统(若为表格存储的新用户,需要点击开通服务后体验,开通免费,订单数据存储在公共实例中,体验不消耗用户存储、流量、Cu)。
注:该样例提供了【亿量级】订单数据。

 

二、搭建准备

若您对于亿量级订单系统的体验不错,希望开始自己系统的搭建之旅,只需按照如下步骤便可以着手搭建了:

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、表设计

订单系统不仅仅是订单一张数据表,它应包含:消费者表、售货员表、产品表、供货商表、交易订单表、支付订单表等。在本样例中,猪腰使用最基本的四张表(消费者表、售货员表、产品表、交易订单表),仅以订单表举例如下:
表名:order_contract

列名数据类型索引类型字段说明
_id(主键列)String MD5(oId)避免热点
oIdStringKEYWORD订单编号
pNameStringTEXT产品名,TEXT类型索引可模糊查询,但不能排序
totalPricedoubleDOUBLE订单总价
orderTimelongLONG下单时间(时间戳)
............

三、开始搭建(核心代码)

1、创建数据表

四张表:订单表、消费者表、售货员表、产品表
用户仅需维护一个实例,按如下方式创建:通过控制台创建、管理数据表(用户也可以通过SDK直接创建):

 

2、创建数据表索引
TableStore自动做全量、增量的索引数据同步:用户可以通过控制台创建、管理SearchIndex(用户也可通过SDK创建):

 

3、数据导入

插入部分测试数据(控制台样例中插入了1亿条数据,用户自己可以通过控制台插入少量测试数据);

订单号订单(md5)(主键)消费者编号消费者姓名售货员编号售货员姓名产品编号产品名产品品牌产品类型下单时间支付时间支付状态产品单价数量总价钱
o0000000000c49f5fd5aba33159accae0d3ecd749a7c0019消陈九s0020售楚十p0003004vivo x21vivo手机2018-07-17 21:00:00 2498.9924997.98
消费者编号(主键)消费者姓名消费者积分注册时间
c0001消赵一8182018-07-07 14:33:51
售货员编号(主键)售货员姓名售货员积分入职日期
s0001售赵一6132018-07-07 14:27:59
产品编号(主键)产品名产品品牌产品类型产品单价新增时间
p0001001iphone 6苹果手机6969.002018-07-07 14:44:39

4、数据读取

数据读取分为两类:

主键读取

基于原生表格存储的主键列获取:getRow, getRange, batchGetRow等。主键读取用于索引(自动)反查,用户也可以提供主键(订单md5)的单条查询的页面,亿量级下查询速度极快。单主键查询方式不支持多维度检索;

索引读取

基于新SearchIndex功能Query:search接口。用户可以自由设计索引字段的多维度条件组合查询。通过设置选择不同的查询参数,构建不同的查询条件、不同排序方式;目前支持:精确查询、范围查询、前缀查询、匹配查询、通配符查询、短语匹配查询、分词字符串查询,并通过布尔与、或组合。
如【c0001号消费者,且消费在99.99以上的订单】组合方式如下:

List<Query> mustQueries = new ArrayList<Query>();TermQuery termQuery = new TermQuery();
termQuery.setFieldName("cId");
termQuery.setTerm(ColumnValue.fromString("c0001"));
mustQueries.add(termQuery);RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("totalPrice");
rangeQuery.setFrom(ColumnValue.fromDouble(99.99));
mustQueries.add(rangeQuery);BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(mustQueries);


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

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

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

相关文章

mybatis-plus的 mapper.xml 路径配置的坑

mybatis-plus今天遇到一个问题&#xff0c;就是mybatis 没有读取到mapper.xml 文件。 #实体扫描&#xff0c;多个package用逗号或者分号分隔 mybatis-plus:typeAliasesPackage: com.gblfy.springboot.mybatisplus.entitymapper-locations:- classpath*:com/gblfy/springboot/*…

加速布局无服务器生态,腾讯云与Serverless.com达成全球战略合作!

在云计算技术领域&#xff0c;“Serverless&#xff08;无服务器&#xff09;”作为一种新型的软件设计架构正在快速崛起。作为继虚拟机、容器后的第三代通用计算平台&#xff0c;Serverless技术也一直是腾讯云原生的重点发力领域。 近日&#xff0c;在由腾讯云主办的首届Tech…

Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...

我已经玩了几个星期的Android编程&#xff0c;我正在尝试一些看起来很简单的工作&#xff0c;但我想我缺少一些东西。我想做的是让背景从白色到黑色平滑地退色。我已经尝试了一些事情&#xff0c;没有一个似乎工作。我做的第一件事是使用for循环和LinearLayout的setBackgroundC…

阿里云周源:一篇文章读懂四代视频加密技术演进

在刚刚圆满落幕的LiveVideoStackCon峰会上&#xff0c;阿里云高级技术专家周源进行了《视频加密和DRM的实施实践》主题分享。周源&#xff0c;有十多年音视频研发经验&#xff0c;之前在淘宝视频负责开放平台&#xff0c;目前在阿里云视频云部门负责媒体处理&#xff0c;在大规…

python程序员怎么做_资料篇:如何自学成为Python程序员

这篇文章是早两年首发其他论坛的&#xff0c;也在知乎回答用过。一直有读者私信我&#xff0c;说这篇文章很有帮助&#xff0c;所以我决定再抽取前篇的资料内容在专栏里。食用指南&#xff1a;1. 没有师傅&#xff0c;没有钱&#xff0c;但是具有一定的计算机理论基础的&#x…

云原生数据库如何打造业务弹性

云计算带来了业务弹性上的极大优势&#xff0c;阿里云数据库高级产品专家时慢从应用架构的变迁&#xff0c;客户实战案例&#xff0c;业务分析等方面详细介绍POLARDB&#xff0c;及如何利用POLARDB设计互联网创新型应用的数据库架构。 应用架构的变迁——为什么我们需要超级MyS…

SpringMVC 集成 mybatisPlus

文章目录一、基础配置1. pom2. web.xml二、配置文件2.1.spring-context.xml2.2. spring-datasource.xml2.3. spring-mvc.xml2.4. jdbc.properties2.5. logback.xml三、基础类3.1. 实体类3.2. 接口类3.3. 接口映射xml3.4. service接口3.5. 接口实现类3.6. 控制层四、数据库方面4…

android重新编译res,使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中lt;meta-datagt;变量的值...

你也能够查看我的其它同类文章。也会让你有一定的收货关于使用Gradle来控制版本号和生成不同版本号的代码。我总结了三篇文章&#xff0c;网上关于这些知识&#xff0c;都比較零散。我在学习这些的之前。根本不知道还有这种方法。所以说不知道并不可怕&#xff0c;可怕的是不知…

四大开源项目联合发布 腾讯已成Github全球贡献前十公司!

近日在Techo开发者大会上&#xff0c;腾讯正式对四大重点开源项目进行了联合发布&#xff0c;包括分布式消息中间件TubeMQ、基于最主流的 OpenJDK8开发的Tencent Kona JDK、分布式HTAP数据库 TBase&#xff0c;以及企业级容器平台TKEStack。 截至目前&#xff0c;腾讯已经在Gi…

5W1H系列 | Nacos 帮我们解决什么问题?(配置管理篇)

Nacos 是阿里巴巴今年7月份开源的项目&#xff0c;如其名&#xff0c; Naming Configuration Service &#xff0c;专注于服务发现和配置管理领域。本系列文章&#xff0c;将从 5W1H&#xff08;What、Where、When、Who、Why、How&#xff09;全面剖析 Nacos&#xff0c;给大家…

tensorflow玻尔兹曼机_资源 | 10种深度学习算法的TensorFlow实现

原标题&#xff1a;资源 | 10种深度学习算法的TensorFlow实现选自 Github作者&#xff1a;blackecho机器之心编译参与&#xff1a;吴攀这个 repository 是使用 TensorFlow 库实现的多种深度学习算法的实现。这个软件包的目标是作为一种命令行实用程序——你可以将其用来快速训练…

实践 | Sentinel 扩展性设计

Sentinel 提供多样的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现&#xff0c;从而可以方便地给 Sentinel 添加自定义的逻辑。 初始化逻辑扩展机制 为了统一初始化的流程&#xff0c;我们抽象出了 InitFunc 接口代表 Sentinel 的…

android 各版本市占率,Android各版本市占率:果冻豆遥遥领先

近日&#xff0c;谷歌公布了最新Android系统各版本的市场占有率。虽说已发布两年之久且推出三个版本的果冻豆系统出现了小幅下滑&#xff0c;但60.8%的市占率依然遥遥领先其它各版本。Android各版本市占率&#xff1a;果冻豆遥遥领先(图片来源于cnbeta)从 谷歌统计数据显示&…

腾讯首度披露基础架构演进史:“海量之道”进化“生而为云”

近日腾讯Techo开发者大会在北京召开。会上腾讯云副总裁、云架构平台部总经理谢明首次对外披露了腾讯基础设施演进与创新历程。他介绍在微信、QQ等国民级业务不断发展的背后&#xff0c;包括服务器、网络、IDC、计算、存储、数据库等在内的基础设施和技术架构一直在不断进化&…

阿里云专家穆轩的《杭州九年程序员之“修炼”手册》

对于一个从未到过南方的内蒙汉子来说&#xff0c;北京的大学一直是中学时憧憬的殿堂&#xff0c;而离家上千公里浙江大学&#xff0c;则是从来没有考虑过的地方。机缘巧合之下&#xff0c;被一位年近七旬的浙大老师说服&#xff0c;我自此开始了南下“修炼”之旅。没想到转眼间…

圆周移位是怎么移的_圆周移位.ppt

圆周移位* x(n) n 0 1 2 3 4 5 6 -1 -2 -3 -4 2 1 3 2 1 3 2 1 3 … … x(n) n 0 1 2 3 4 5 6 -1 -2 -3 -4 2 1 3 2 1 3 2 1 3 … … n x(-n) 0 1 2 3 4 5 6 -1 -2 -3 -4 … … 2 1 3 2 1 3 2 1 3 x(-n) n 0 1 2 3 4 5 6 -1 -2 -3 -4 … … 2 1 3 2 1 3 2 1 3 例&#xff1a;求…

SpringMVC 集成 mybatisPlus 分析

文章目录1. pom 依赖替换2. 扫描包3. pom 依赖替换4. dao层接口继承 extends BaseMapper5. 源码地址1. pom 依赖替换 mybatis依赖 <properties><org.mybatis.version>3.4.1</org.mybatis.version><org.mybatis.spring.version>1.3.0</org.mybatis.…

主流开源开发者工具落地阿里云,进一步提升开发者体验

在云计算大数据时代&#xff0c;企业的不断上云&#xff0c;业务的不断发展&#xff0c;技术架构的不断演进&#xff0c;导致资源、应用和数据的管理成本不断增加&#xff0c;运维难度不断加大。业务场景的不断和复杂和变化&#xff0c;不得不引起我们更多的思考&#xff1a; …

android地图方位角_Android获取经纬度、计算距离、方位角

最近在Android上做GPS的东西&#xff0c;获取经纬度、计算距离、方位角&#xff0c;感觉在搞GIS样。当然&#xff0c;玩笑了&#xff0c;玩玩而已&#xff0c;稍微总结一下。经度指示南北方向&#xff0c;纵向。纬度指示东西方向&#xff0c;横向.获取经纬度使用GPS权限&#x…