一种灵活的数据架构

一般来说,电商数据架构是比较复杂的,做过电商的同学都有深刻的体会。
具体复杂在什么地方呢,举几个具体的例子:
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 | createTime2  我们定义个管理表空间的物理表(元数据表,属于静态部分),一旦有人在此表注册一个表空间,那么就自动根据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=1union 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。13sandbox:修改集是一种沙箱概念。
我们约定如果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可以在上面方便的拓展和生长。

时间: 2024-10-13 05:41:34

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

成为数据开发工程师?常用的几种大数据架构剖析你都掌握了吗?

数据分析工作虽然隐藏在业务系统背后,但是具有非常重要的作用,数据分析的结果对决策.业务发展有着举足轻重的作用.随着大数据技术的发展,数据挖掘.数据探索等专有名词曝光度越来越高,但是在类似于Hadoop系列的大数据分析系统大行其道之前,数据分析工作已经经历了长足的发展,尤其是以BI系统为主的数据分析,已经有了非常成熟和稳定的技术方案和生态系统,对于BI系统来说,大概的架构图如下: 可以看到在BI系统里面,核心的模块是Cube,Cube是一个更高层的业务模型抽象,在Cube之上可以进行多种操作,例如

当前一种先进实用的架构设计

目录 1系统架构图...1 2架构设计...3 2.1项目开发环境...3 2.2运行环境要求:...3 2.3 服务器架构平台:...4 2.4.架构逻辑设计...5 2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群...5 2.4.2mysql集群...6 2.4.3fastdfs图片服务器集群...8 2.4.4acveMQ服务器集群...8 3 架构剖析...10 3.1负载均衡器解析...10 3.2 lvs解析...11 3.3keeplived解析

大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术

大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选择合适的技术,了解大数据各种技术之间的关系,选择合适的语言. 我们可以带着下面问题来阅读本文章: 1.hadoop都包含什么技术 2.Cloudera公司与hadoop的关系是什么,都有什么产品,产品有什么特性 3. Spark与hadoop的关联是什么? 4. Storm与hadoop的关联是什么

SFS Store 一种简单应用存储架构

SFS Store 一种简单应用存储架构html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.6}body{-webkit-touch-callout:none;font-family:-apple-system-font,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft

后Hadoop时代的大数据架构

提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不用Hadoop,而是像NoSQL (Not Only SQL)那样,有其他的选型补充.我在知乎上也写过Hadoop的一些入门文章 如何学习Hadoop – 董飞的回答,为了给大家有个铺垫,简单讲一些相关开源组件. 背景篇 MapReduce:技术提供了感知数据位置的标准化处理流程:读取数据,对数据进

后Hadoop时代的大数据架构(转)

原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞 提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x 进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不用Hadoop,而是像NoSQL (Not Only SQL)那样,有其他的选型补充.我在知乎上也写过Hadoop的一些入门文章 如何学习Hadoop - 董飞的回答,为了给大家有个铺垫

数据架构的演变

大数据技术的兴起,让企业能够更加灵活高效地使用自己的业务数据,从数据中提取出更多重要的价值,并将数据分析和挖掘出来的结果应用在企业的决策.营销.管理等应用领域.但不可避免的是,随着越来越多新技术的引入与使用,企业内部一套大数据管理平台可能会借助众多开源技术组件实现. 01 传统数据基础架构 如图1-1所示,传统单体数据架构(Monolithic Architecture)最大的特点便是集中式数据存储,企业内部可能有诸多的系统,例如Web业务系统.订单系统.CRM系统.ERP系统.监控系统等,这些

企业架构,业务架构,数据架构

我们将核心价值链上的端到端总结为两个核心,其一是供应链的端到端流程和业务:其二是产品研发的端到端和业务.各个企业由于类型不同往往对两条价值链各有 侧重.生产代工类企业没有自己的产品研发,那么只有供应链:高科技研发企业可以做到卖产品核心技术和专利,不做具体供应链方面事情.而更多的生产制造型企 业往往是1和2两者的一个有机结合. 再谈企业架构和业务架构: 企业架构本身强调的是业务驱动IT,业务和IT的匹配和融合而不是两张皮,在这里可以看到核心我们关注的点包括流程,活动,数据,组织,资源五个方面的内容

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMembership(在MVC 4中使用)都有所不同. Microsoft.AspNet.Identity是符合微软开放Owin标准里面Security标准的一种实现.且在MVC 5中默认使用EntityFramework作为Microsoft.A