一种灵活的电商数据架构

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文来自中生代技术交流群,本文主要分享了面对复杂的电商数据架构该如何对进行设计。以举例的方式从代码和架构的角度为大家带来了一种灵活的电商数据架构设计分享。
一般来说,电商数据架构是比较复杂的,做过电商的同学都有深刻的体会。

具体复杂在什么地方呢,举几个具体的例子:
  • 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可以在上面方便的拓展和生长。



                                                        中生代技术群微信公众号

                                                da9312524921e637b684eed7bf3249db58f7badc

本文作者 高磊

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 人工智能
揭秘!47页文档拆解苹果智能,从架构、数据到训练和优化
【8月更文挑战第23天】苹果公司发布了一份47页的研究文档,深入解析了其在智能基础语言模型领域的探索与突破。文档揭示了苹果在此领域的雄厚实力,并分享了其独特的混合架构设计,该设计融合了Transformer与RNN的优势,显著提高了模型处理序列数据的效能与表现力。然而,这种架构也带来了诸如权重平衡与资源消耗等挑战。苹果利用海量、多样的高质量数据集训练模型,但确保数据质量及处理噪声仍需克服。此外,苹果采取了自监督与无监督学习相结合的高效训练策略,以增强模型的泛化与稳健性,但仍需解决预训练任务选择及超参数调优等问题。
140 66
|
3月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
62 0
|
13天前
|
消息中间件 缓存 Java
亿级流量电商平台微服务架构详解
【10月更文挑战第2天】构建一个能够处理亿级流量的电商平台微服务架构是一个庞大且复杂的任务,这通常涉及到多个微服务、数据库分库分表、缓存策略、消息队列、负载均衡、熔断降级、分布式事务等一系列高级技术和架构模式。
50 3
|
16天前
|
存储 大数据 数据处理
洞察未来:数据治理中的数据架构新思维
数据治理中的数据架构新思维对于应对未来挑战、提高数据处理效率、加强数据安全与隐私保护以及促进数据驱动的业务创新具有重要意义。企业需要紧跟时代步伐,不断探索和实践新型数据架构,以洞察未来发展趋势,为企业的长远发展奠定坚实基础。
|
1月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
36 5
|
2月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
2月前
|
存储 监控 安全
大数据架构设计原则:构建高效、可扩展与安全的数据生态系统
【8月更文挑战第23天】大数据架构设计是一个复杂而系统的工程,需要综合考虑业务需求、技术选型、安全合规等多个方面。遵循上述设计原则,可以帮助企业构建出既高效又安全的大数据生态系统,为业务创新和决策支持提供强有力的支撑。随着技术的不断发展和业务需求的不断变化,持续优化和调整大数据架构也将成为一项持续的工作。
|
2月前
|
机器学习/深度学习 自然语言处理 数据处理
|
2月前
|
缓存 程序员 调度
第3章-图形处理单元-3.1-数据并行架构
第3章-图形处理单元-3.1-数据并行架构
31 1
|
2月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
59 0