一种灵活的电商数据架构

一般来说,电商数据架构是比较复杂的,做过电商的同学都有深刻的体会。

具体复杂在什么地方呢,举几个具体的例子:

  • 1.每种商品都有自己的独特属性。比如鞋子和电脑的属性是完全不一样的。如何对他们构造商品数据架构?
  • 2.如何维护它们。不至于因为业务的发展,使得数据结构变得异常复杂而无法拓展和维护?
  • 3.未来可能会卖更多种类的商品、我们人类也会发明出来更多新的商品。如何适应变化?
  • 4.每秒钟的并发量十分巨大,数据架构在这方面如何考量?
  • 5.商品数据配置错误,如果快速就地回滚,为线上快速止血?
  • 6.如何为整个开发周期提供支持?
  • 7.其它原因 。

在电商这样的场景下,某些问题就变得异常复杂了!

如果我们还是按照传统方式来设计数据架构,比如说和领域模型强绑定的ER方式来设计数据架构,必然会导致数据架构随着业务的发展而变得越来越复杂!
 
所以需要一种新型的数据架构来解决我们系统的基础性问题。

这里提供一种新的思路,也在实际生产环境中验证过了。各位看官和我一起看过来:

  • 1.建立统一的、可管理的数据平台,防止数字孤岛的产生,提高数据共享程度并兼顾性能的监管和提升。
  • 2.我们为数据架构提供机制而并不提供策略。将策略放到App端来决定,由App来决定其领域的上层数据架构,不管什么样的电商APP都可以从数据平台“长出来”,模式自由化,做到Code First!
  • 3.提供数据沙箱和多版本回溯的能力,能够快速建立数据clone和止血。
  • 4.提供电商基础数据架构的抽象。


基于上面的考虑,我们有这样的具体设计和实现:

不同流程、不同节点所绑定的数据模式是不一样的。

比如不同类型客户(普通客户、客户经理等等)对于平台而言对业务的处理流程不同,会形成不同类型的订单,不同类型的订单会产生不同的结算数据模式。

所以模式动态化是一个非常重要的设计轨迹,不然数据模式必然非常复杂,难以拓展和维护,表的数量越多,也会带来性能问题。

互联网系统无非是:  App = 功能编排 + 流程编排 + 业务规则 + 数据编排

所以基本设计思路是:动静分离


静的部分
是系统元数据部分,它们提供了流程编排、功能编排、业务规则以及动态表元数据管理等功能。
动的部分
动的部分,就是动态表的部分,表示最终的业务数据,并且业务数据可以整体加密了(因为他们是JSON),数据访问的方式都采用数据中间件的方式(比如Mycat)。实现方式是:

  • 1.表空间就是一个MySQL 5.7 + 物理表。表的字段统一都是:
  • Id | header | payload | creator | createTime
  • 2.我们定义个管理表空间的物理表(元数据表,属于静态部分),一旦有人在此表注册一个表空间,那么就自动根据1中的模式生成一个物理表
  • 3.我们定义一个管理动态表模式的物理表(元数据表,属于静态部分),它使用JSON字符串保存描述动态表结构的json-schema。假设如此:

并根据此模式动态生成虚拟列(这是mysql 5.7+本身的能力,具体的请查询官网资料MysqL Json functions)

  • 4.我们在写入数据到新建的表空间的时候,根据某个json-schema描述的结构来写入header和data字段,并且使用jsonschema-validator验证格式是否正确。形式如下:
    header: { “table”:”a”,
                     ”sandbox”:”test”,
                     ”version”:”时间戳”,
                      snapshot=”标记名字”,
                     ”schemaname”:”aschema” }
    
    payload:{ “id”:”1”,
                     ”name”:”leo”,
                     ”price”:78.89 }   //业务数据
  • 5.
    此时上层查询类似于:dataContext.select().from(“a”).where(“id=1”);(推荐采用Jinq和JooQ的方
    式)虚拟表名在datacontext中可以根据元数据反向找到对应的所有表空间,然后动态形成   union all
    SQL并提交MySQL服务器执行。
  • 6.底层解释为:select id, name, price from 名空间名称 where table=”a” and id=1,union all 其他表空间 where table=”a”…….

我们约定:
    1)  一个虚拟表A可以保存在N个表空间中
    2)  一个表空间可以保存N个虚拟表
    3)  底层DataContext为上层提供透明性,只需要提供虚拟表名、需要提取的列名以及条件即可获取数据,并不会感觉到差异。

虚拟表和表空间的关系由静态元数据表来维护。
   
这样做的目的,是一个虚拟表可以分布在不同表空间甚至是不同库的表空间中,将数据散列,一遍形成分布式表,达到较好的性能要求。

另外上层程序代码通过数据中间件访问数据源,自动分表,进一步提高了性能指标。

7.实际上形成了一个虚拟表体制。
8.我们称payload中json的Id为虚拟表Id,这一点不要和表空间(物理表)的Id向混淆。
9.我们在header中记录版本,如果有N个id=1的虚拟表记录的话,那么我们在上层DataAPI将会看到的数据是版本最大的那一个(这个过程叫做版本塌陷)。
10.如果我们需要回滚数据,只需要指定一个版本并query这个版本的数据并插入虚拟表即可,所有数据形成的历史将会保存起来。
11.在一个表空间(物理表)中,可以存在很多不同schema的虚拟表。
这样我们就具备了一个解放模式的动态表架构,不过要注意:
    1) 由于Mycat的存在,表空间的数据量不会对性能产生不好的影响。
    2) DataAPI应该可以构建并提交静态表和动态虚拟表的联合查询(Mysql支持的)
    3) 迫使我们必须将底层数据架构DataAPI化,这样就做到上层代码会认为静态表和动态表并无差别,做到底层数据架构透明化。
    4) 提供管理API,可以维护元数据的方式动态构成动态表。

12如何实现动态表记录的修改、删除:

    1). 修改:对物理表data字段进行修改,
使用:添加一条新的包含修改好的数据记录,并在header中写入op=modify。来实现更新业务数据。

    2). 删除:按虚拟Id添加一个header中op为del值的空白记录
如:

header: { “table”:”a”,
                  ”changeset”:”test”,
                  ”version”:”时间戳”,
                   snapshot=”标记名字”,
                  ”schemaname”:”aschema”,
                  ”id”:”1” }

payload:NULL   // 业务数据。

NULL是个特殊的值,表示已删除。

此时查询时判断payload =NULL and id=1,这条记录就没有了,查询结果为null。
13.sandbox:修改集是一种沙箱概念。

我们约定如果sandbox =test,那么这里的数据就是给beta测试用的。

如果是release就是给正式环境用的。

于是我们预设这样的sandbox名字:
    A:dev 开发用数据
    B:test 测试用数据
    C:release 正式用数据

我们可以这样认为对数据进行了虚拟分区。

一个重要的副产品就是,如果我们需要作一个将会用于正式环境的test数据集,测试之后,我们只需要需要changset为release,那么数据集立即生效,正式环境就可以用了。
 
静态表部分,还设计了工作流部分、业务元数据部分、标签系统部分、权限管理的数据模型,这些模型是稳定的,并且是属于元数据的,动态部分是不同app所形成的模型。

至此,我们用有限的底层数据模型手段就可以对应千变万化的业务数据架构了。

  1. 应用管理静态表: App为前缀的表,  负责应用产品通道的管理
  2. 工作流相关静态表: Workflow为前缀的表,负责定义和管理工作流实例
  3. 工作流Form静态表: WorkflowForm为前缀的表,定义工作流节点相关的表单以及规则绑定
  4. 非工作流Form静态表: NormalForm为前缀的表,定义非工作流绑定的,普通的表单
  5. 业务数据元数据静态表: 为业务提供度量衡、城市、地铁等等元数据支持
  6. 表空间管理静态表: 用来注册表空间,并由DataAPI服务器创建具体的物理表
  7. 动态表模式管理静态表: 动态表注册到表空间,schema注册,并由DataAPI创建动态表
  8. 权限管理相关静态表: 应用权限的定义和分配
  9. 标签静态表: 用于管理定义标点和打标的表

预设动态表说明:预设的动态表对应的json-schema不可以被删除和修改,作为root业务基础存在!

之后后续的版本都是基于这个root演变出来的。

每个表空间中的表,全部是根据业务形态定义的,定义权利交给了App,也就是通过App代码定义动态表,做到Code First。

并且一个动态表可以有N个注册在表空间中的多个模式,模式也具备版本。

也就是说虚拟表的列定义是可以动态拓展的,并且同时只有一个最新的会生效,可以有回滚模式。

我们约定:动态表的定义就等同于其JSON-schema的定义,也就是说一个动态表对应一个固定的JSON-schema.

  1. 交易主体表空间
  2. 计算规则定义表空间
  3. 购物车表空间
  4. 订单表空间
  5. 财务表空间
  6. 商品表空间

总之,灵活的底层数据架构,决定了基础数据API服务变成了一种基础设施,使得其他业务APP可以在上面方便的拓展和生长。



                                                        中生代技术群微信公众号

                                               

本文作者 高磊

中生代技术微信号公众号:freshmanTechnology

时间: 2024-09-11 06:25:40

一种灵活的电商数据架构的相关文章

如何打造一个小而精的电商网站架构?

本文大纲: 1. 小型电商网站的架构 2. 日志与监控系统的解决方案 3. 构建数据库的主从架构 4. 基于共享存储的图片服务器架构 5. 移动M站建设 6. 系统容量预估 7. 缓存系统      一.小型电商网站的架构     刚从传统软件行业进入到电商企业时,觉得电商网站没有什么技术含量,也没有什么门槛,都是一些现有的东西堆积木似的堆出来罢了.然而,真正进入到这个行业之后,才发现并非如此.有人说过,好的架构,是演化出来的,电商网站的架构也是如此.现在好的电商网站,看似很复杂,很牛逼,其实也

电商总结(八)如何打造一个小而精的电商网站架构

前面写过一些电商网站相关的文章,这几天有时间,就把之前写得网站架构相关的文章,总结整理一下.把以前的一些内容就连贯起来,这样也能系统的知道,一个最小的电商平台是怎么一步步搭建起来的.对以前的文章感兴趣的朋友可以看这个,http://www.cnblogs.com/zhangweizhong/category/879056.html   本文大纲: 1. 小型电商网站的架构 2. 日志与监控系统的解决方案 3. 构建数据库的主从架构 4. 基于共享存储的图片服务器架构 5. 移动M站建设 6. 系

电商基础架构建设之路

在2016年的最后一天,奉上本年度最后一篇文章,也是为自己在当当的工作画上句号. 本人已经离开当当(可称为猴厂),加入饿了么(人称饿厂),负责北京研发中心.以前是输送精神食粮,现在是物质食粮,都是为人民服务,而且人可以不读书,但是不能不吃饭,所以跟生活更息息相关. 在此感谢多年来给我帮助和支持的当当领导和同事,在当当的这几年,经历了很多,结识了很多好朋友,也收获了许多成长,相信当当会越来越好,架构部做出更多的成绩,引领当当技术体系更进一步,小伙伴们事业蒸蒸日上. 今天分享的内容是"电商基础架构建

AdMaster发布国内首创电商数据监测解决平台,拥抱电商迎接变革

(8月21日,上海)中国领先的独立第三方数字营销大数据提供商AdMaster(精硕科技)在北京.上海发布国内首创的电商数据监测解决平台RetailMaster,并以"拥抱电商 迎接变革"主题研讨会的形式分享了大数据时代品牌电子商务可持续增长的数字化解决方案.会议上,AdMaster介绍了国内首个利用三方数据打通来诠释互联网媒体引流到电商购物成单转化过程,来帮助品牌寻找更好的互联网电子营销综合解决方案. 海尔集团品牌运营总监王梅艳."一号店"副总裁郭冬东.AdMast

电商数据造假探密:口径标准不一 退货交易额未剔除

20亿元,59亿元,2012年目标300亿元.这是苏宁易购3年来的增长数据. 102亿元,309亿元,2012年目标1000亿元.这是京东商城3年来的增长数据. 4000亿元,6500亿元,2012年目标10000亿元.这是淘宝系3年来的增长数据. 数据脱口而出,难免让人怀疑,放到线下的http://www.aliyun.com/zixun/aggregation/7858.html">传统零售业,无论如何,在这样的量级是不可能有这么快的增长速度的. 即使参考同类型的全球最大的B2C电子商

一种面向云计算业务的SDN架构

一种面向云计算业务的SDN架构 张睿汭 汪洋 随着迁移到云的应用及业务数量和种类的快速增长,联网能力越来越重要.由云服务提供商和云控制器平台提供的联网支持发展迅速.然而,在大多数云联网服务模型中,用户必须配置各种网络层的构造(如交换机.子网和访问控制列表)以供云应用使用.本文提出一种服务级网络模型,该模型能够提供云应用所需要的更高级的连通性和策略抽象. 来源:2013年中国通信学会信息通信网络技术委员会年会论文集 一种面向云计算业务的SDN架构

电商数据造假、买排名被指成业内普遍现象

数据造假成电商普遍现象,专家表示杜绝要靠企业自律. 造数据买排名电商数据信唔过? "今天你网购了吗?"不知不觉间进入了如火如荼的电子商务时代,尿片.奶粉,甚至下一餐的饭,都恨不得用手指的点击来搞掂.然而近日,京东等电商被卷入"数据造假"风波,使得本就遥不可及的虚拟世界,再多一重欺骗的阴影.造数据.买排名--犹如原始时代的不成熟的网络时代,让人"想说爱你不容易". 文/记者 冯秋瑜 图/新华社 电商被指数据造假 "祝全体朋友们生日快乐!祝

“双十一”狂欢 电商数据中心 你准备好了吗

随着"双十一"的临近,电商市场硝烟弥漫.天猫.京东.易迅.苏宁等http://www.aliyun.com/zixun/aggregation/7871.html">电子商务平台摩拳擦掌.使出浑身解数,准备在"双十一"当天逐鹿厮杀.花样翻新的促销手段.O2O的全新零售模式.创意新颖的广告营销,在临近"双十一"的这几天轮番轰炸各大媒体平台,公众的关注焦点亦被牢牢锁定.面对令人垂涎欲滴的网购市场,人人都想分一杯羹,但电商平台真的准备好

腾讯电商业务架构重组虽已完成仍面临流量变现难题

酝酿许久的腾讯架构重组终于浮出水面. 上周五,腾讯内部发文称,腾讯将从原有的业务系统制升级为事业群制,把现有业务重新划分成企业发展事业群(CDG).互动娱乐事业群(IEG).移动互联网事业群(MIG).网络媒体事业群(OMG).社交网络事业群(SNG),整合原有的研发和运营平台,成立新的技术工程事业群(TEG). 值得注意的是,电商业务单独拆分为腾讯电商控股公司(ECC),成为腾讯的全资子公司.在<第一财经日报>获得的一封内部邮件中,新任腾讯电商控股公司CEO吴宵光称,电商控股公司将在管理体系