苏州做网站公司排名,怎么在wordpress顶栏里,建一家公司需要多少钱,怎么做网站生意一、方案背景
订单系统存在于各行各业#xff0c;如电商订单、银行流水、运营商话费账单等#xff0c;是一个非常广泛、通用的系统。对于这类系统#xff0c;在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展#xff0c;以及各企业对数据的重视#xff0c;…一、方案背景
订单系统存在于各行各业如电商订单、银行流水、运营商话费账单等是一个非常广泛、通用的系统。对于这类系统在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展以及各企业对数据的重视需要存储和持久化的订单量越来越大。数据的重视程度与数据规模的膨胀带来了新的挑战。
需求场景
某电商平台A需要进行持久化所有平台产生的订单数据。同时基于所有的订单数据系统又需要向外提供面向多种角色消费者、店家、平台三类人群的多元化的查询服务。消费者可以查询自己的历史订单商家可以统计热销产品平台也可以分析用户行为、平台交易规模等。主要查询方式涵盖订单的多维度检索以及订单数据的分析、统计等例如 面向消费者【A消费者】*【近1年】*【卖出电脑】订单查询 面向售货员【B售货员】*【近1个月】销售订单 ......
技术点
在订单场景中技术上通常需要考虑的技术点主要包含如下几个方面
查询能力需要具备丰富的查询类型如多维度、范围、模糊查询等同时具备排序、统计等功能数据量存储海量数据的同时满足强一致、高可用、低成本等要求服务性能应对高并发请求高并发的同时保证低延迟
实现多维、实时查询功能是订单管理解决方案的核心功能。
二、方案演进
应对订单场景电商通常会采用MySQL传统方案。借助关系型数据库强大的查询能力用户可直接通过SQL语句实现订单数据的多维度查询、数据统计等。所谓数据膨胀分为横向、纵向两种横向即不断迭代引入的新字段维度纵向即总的存储数据量。在面对这两种订单数据膨胀上单MySql方案逐渐变得吃力。 SQL NoSQL的组合方案以下称组合方案便应运而生借助两个数据库各自的优势分别解决不同场景各自的需求。但组合方案同样也带来了新的问题组合方案牺牲空间成本同时也增加了开发工作量与运维复杂度。在保证数据一致性上产生额外开销。 下面让我们看一下如下几个常规方案
常规方案
1、MySql分库分表方案
MySql自身拥有强大的数据查询、分析功能基于MyQql创建订单系统可以应对订单数据多维查询、统计场景。伴随着订单数据量的增加用户会采取分库、分表方案应对通过这种伪分布式方案解决数据膨胀带来的问题。但数据一旦达到瓶颈便需要重新创建更大规模的分库数据的全量迁移麻烦就会不断出现。数据迭代、膨胀带来的困扰是MySql方案难于逾越的。仅仅依靠MySql的传统订单方案短板凸显。 1、数据纵向数据规模膨胀采用分库分表方案MySql在部署时需要预估分库规模数据量一旦达到上限后重新部署并做数据全量迁移 2、数据横向字段维度膨胀schema需预定义迭代新增新字段变更复杂。而维度到达一定量后影响数据库性能
2、MySqlHBase方案
引入双数据的方案应运而生通过实时数据、历史数据分存的方案可以一定程度解决数据量膨胀问题。该方案将数据归类成两部分存储实时数据、历史数据。同时通过数据同步服务将过期数据同步至历史数据。 1、实时订单数据例如近3个月的订单将实时订单存入MySql数据库。实时订单的总量膨胀的速度得到了限制同时保证了实时数据的多维查询、分析能力 2、历史订单数据例如3个月以前的订单将历史订单数据存入HBase借助于HBase这一分布式NoSql数据库有效应对了订单数据膨胀困扰。也保证了历史订单数据的持久化 但是该方案牺牲了历史订单数据对用户、商家、平台的使用价值假设了历史数据的需求频率极低。但是一旦有需求便需要全表扫描查询速度慢、IO成本很高。而维护数据同步又带来了数据一致性、同步运维成本飙升等难题
3、MySqlElasticsearch方案
组合方案还有MySqlElasticsearch该方案同样是将数据分两部分存储可以一定程度解决订单索引维度增长问题。用户自己维护数据同步服务保证两部分数据的一致性 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邀测】机密信息:请填写【地域实例名】例上海myInstanceName3、SDK下载
使用具有多元索引SearchIndex的SDK官网地址暂时java、go、node.js三种SDK增加了新功能
java-SDK
dependencygroupIdcom.aliyun.openservices/groupIdartifactIdtablestore/artifactIdversion4.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功能Querysearch接口。用户可以自由设计索引字段的多维度条件组合查询。通过设置选择不同的查询参数构建不同的查询条件、不同排序方式目前支持精确查询、范围查询、前缀查询、匹配查询、通配符查询、短语匹配查询、分词字符串查询并通过布尔与、或组合。 如【c0001号消费者且消费在99.99以上的订单】组合方式如下
ListQuery mustQueries new ArrayListQuery();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);
原文链接 本文为云栖社区原创内容未经允许不得转载。