一种灵活的电商数据架构

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 本文来自中生代技术交流群,本文主要分享了面对复杂的电商数据架构该如何对进行设计。以举例的方式从代码和架构的角度为大家带来了一种灵活的电商数据架构设计分享。
一般来说,电商数据架构是比较复杂的,做过电商的同学都有深刻的体会。

具体复杂在什么地方呢,举几个具体的例子:
  • 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
4月前
|
存储 缓存 安全
某鱼电商接口架构深度剖析:从稳定性到高性能的技术密码
某鱼电商接口架构揭秘:分层解耦、安全加固、性能优化三维设计,实现200ms内响应、故障率低于0.1%。详解三层架构、多引擎存储、异步发布、WebSocket通信与全链路防护,助力开发者突破电商接口“三难”困境。
|
7月前
|
存储 BI Shell
Doris基础-架构、数据模型、数据划分
Apache Doris 是一款高性能、实时分析型数据库,基于MPP架构,支持高并发查询与复杂分析。其前身是百度的Palo项目,现为Apache顶级项目。Doris适用于报表分析、数据仓库构建、日志检索等场景,具备存算一体与存算分离两种架构,灵活适应不同业务需求。它提供主键、明细和聚合三种数据模型,便于高效处理更新、存储与统计汇总操作,广泛应用于大数据分析领域。
752 2
|
7月前
|
SQL 缓存 前端开发
如何开发进销存系统中的基础数据板块?(附架构图+流程图+代码参考)
进销存系统是企业管理采购、销售与库存的核心工具,能有效提升运营效率。其中,“基础数据板块”作为系统基石,决定了后续业务的准确性与扩展性。本文详解产品与仓库模块的设计实现,涵盖功能概述、表结构设计、前后端代码示例及数据流架构,助力企业构建高效稳定的数字化管理体系。
|
4月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
6月前
|
数据采集 缓存 前端开发
如何开发门店业绩上报管理系统中的商品数据板块?(附架构图+流程图+代码参考)
本文深入讲解门店业绩上报系统中商品数据板块的设计与实现,涵盖商品类别、信息、档案等内容,详细阐述技术架构、业务流程、数据库设计及开发技巧,并提供完整代码示例,助力企业构建稳定、可扩展的商品数据系统。
|
8月前
|
安全 测试技术 API
电商API接口开发:基础架构搭建全攻略
本文详细解析了电商API接口从零搭建基础架构的全流程。首先通过需求分析明确业务功能与接口规范,选定数据格式(如JSON)及通信方式(如RESTful)。接着在架构设计阶段选择合适的技术栈、数据库方案,并引入API网关实现统一管理。开发实现部分涵盖认证授权、数据访问、日志记录与异常处理等核心功能。安全防护则强调数据加密、传输安全及速率限制策略。测试优化阶段包括单元测试、集成测试、性能与安全测试,确保接口稳定性。最后通过工具生成清晰的API文档并实施版本控制,为开发者提供便利。整体流程系统化、模块化,助力打造高效、安全的电商API接口。
|
5月前
|
数据采集 机器学习/深度学习 搜索推荐
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
MIT与丰田研究院研究发现,扩散模型的“局部性”并非源于网络架构的精巧设计,而是自然图像统计规律的产物。通过线性模型仅学习像素相关性,即可复现U-Net般的局部敏感模式,揭示数据本身蕴含生成“魔法”。
256 3
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
|
8月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
508 102
|
5月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。
|
6月前
|
数据采集 监控 数据可视化
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
本案例讲述了在豆瓣电影数据采集过程中,面对数据量激增和限制机制带来的挑战,如何通过引入爬虫代理、分布式架构与异步IO等技术手段,实现采集系统的优化与扩展,最终支撑起百万级请求的稳定抓取。
373 0
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研