千家信息网

订单中心,1亿数据架构,这次服了

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍"订单中心,1亿数据架构,这次服了",在日常操作中,相信很多人在订单中心,1亿数据架构,这次服了问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"订单中心,
千家信息网最后更新 2024年11月11日订单中心,1亿数据架构,这次服了

这篇文章主要介绍"订单中心,1亿数据架构,这次服了",在日常操作中,相信很多人在订单中心,1亿数据架构,这次服了问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"订单中心,1亿数据架构,这次服了"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

订单中心,是互联网业务中,一个典型的"多key"业务,即:用户ID,商家ID,订单ID等多个key上都有业务查询需求。

随着数据量的逐步增大,并发量的逐步增大,订单中心这种"多key"业务,架构应该如何设计,有哪些因素需要考虑,是本文将要系统性讨论的问题。

什么是"多key"类业务?

所谓的"多key",是指一条元数据中,有多个属性上存在前台在线查询需求。

订单中心是什么业务,有什么典型业务需求?

订单中心是一个非常常见的"多key"业务,主要提供订单的查询与修改的服务,其核心元数据为:

Order(oid, buyer_uid, seller_uid, time, money, detail…);

其中:

  • oid为订单ID,主键;

  • buyer_uid为买家uid;

  • seller_uid为卖家uid;

  • time, money, detail, …等为订单属性;

数据库设计上,一般来说在业务初期,单库,配合查询字段上的索引,就能满足元数据存储与查询需求。

  • order-center:订单中心服务,对调用者提供友好的RPC接口;

  • order-db:对订单进行数据存储,并在订单,买家,卖家等字段建立索引;

随着订单量的越来越大,数据库需要进行水平切分,由于存在多个key上的查询需求,用哪个字段进行切分呢?

  • 如果用oid来切分,buyer_uid和seller_uid上的查询则需要遍历多库;

  • 如果用buyer_uid或seller_uid来切分,其他属性上的查询则需要遍历多库;

总之,很难有一个万全之策,在展开技术方案之前,先一起梳理梳理查询需求。

任何脱离业务需求的架构设计,都是耍流氓。

订单中心,典型业务查询需求有哪些?

第一类,前台访问,最典型的有三类需求:

  • 订单实体查询:通过oid查询订单实体,90%流量属于这类需求;

  • 用户订单列表查询:通过buyer_uid分页查询用户历史订单列表,9%流量属于这类需求;

  • 商家订单列表查询:通过seller_uid分页查询商家历史订单列表,1%流量属于这类需求;

前台访问的特点是什么呢?

吞吐量大,服务要求高可用,用户对订单的访问一致性要求高,商家对订单的访问一致性要求相对较低,可以接受一定时间的延时。

第二类,后台访问,根据产品、运营需求,访问模式各异:

按照时间,价格,商品,详情来进行查询;

后台访问的特点是什么呢?

运营侧的查询基本上是批量分页的查询,由于是内部系统,访问量很低,对可用性的要求不高,对一致性的要求也没这么严格,允许秒级甚至十秒级别的查询延时。

这两类不同的业务需求,应该使用什么样的架构方案来解决呢?

要点一:前台与后台分离的架构设计。

如果前台业务和后台业务共用一批服务和一个数据库,有可能导致,由于后台的"少数几个请求"的"批量查询"的"低效"访问,导致数据库的cpu偶尔瞬时100%,影响前台正常用户的访问(例如,订单查询超时)。

前台与后台访问的查询需求不同,对系统的要求也不一样,故应该两者解耦,实施"前台与后台分离"的架构设计。

前台业务架构不变,站点访问,服务分层,数据库水平切分。

后台业务需求则抽取独立的web/service/db来支持,解除系统之间的耦合,对于"业务复杂""并发量低""无需高可用""能接受一定延时"的后台业务:

  • 可以去掉service层,在运营后台web层通过dao直接访问数据层;

  • 可以不需要反向代理,不需要集群冗余;

  • 可以通过MQ或者线下异步同步数据,牺牲一些数据的实时性;

  • 可以使用更契合大量数据允许接受更高延时的"索引外置"或者"HIVE"的设计方案;

解决完了后台业务的访问需求,那前台的oid,buyer_uid,seller_uid如何来进行数据库水平切分呢?

要点二:多个维度的查询较为复杂,对于复杂系统设计,应该逐个击破。

假设没有seller_uid,应该如何击破oid和buyer_uid的查询需求?订单中心,假设只有oid和buyer_uid上的查询需求,就蜕化为一个"1对多"的业务场景,对于"1对多"的业务,水平切分应该使用"基因法"。

要点三:基因法,是解决"1对多"业务,数据库水平切分的常见方案。

什么是分库基因?

通过buyer_uid分库,假设分为16个库,采用buyer_uid的方式来进行数据库路由,所谓的模16,其本质是buyer_uid的最后4个bit决定这行数据落在哪个库上,这4个bit,就是分库基因。

什么是基因法分库?

在订单数据oid生成时,oid末端加入分库基因,让同一个buyer_uid下的所有订单都含有相同基因,落在同一个分库上。

如上图所示,buyer_uid=666的用户下了一个订单:

  • 使用buyer_uid分库,决定这行数据要插入到哪个库中;

  • 分库基因是buyer_uid的最后4个bit,即1010;

  • 在生成订单标识oid时,先使用一种分布式ID生成算法生成前60bit(上图中绿色部分);

  • 将分库基因加入到oid的最后4个bit(上图中粉色部分),拼装成最终64bit的订单oid(上图中蓝色部分);

通过这种方法保证,同一个用户下的所有订单oid,都落在同一个库上,oid的最后4个bit都相同,于是:

  • 通过buyer_uid能够定位到库;

  • 通过oid也能定位到库;

假设没有oid,应该如何击破buyer_uid和seller_uid的查询需求?订单中心,假设只有buyer_uid和seller_uid上的查询需求,就蜕化为一个"多对多"的业务场景,对于"多对多"的业务,水平切分应该使用"数据冗余法"。

如上图所示:

  • 当有订单生成时,通过buyer_uid分库,oid中融入分库基因,写入DB-buyer库;

  • 通过线下异步的方式,通过binlog+canal,将数据冗余到DB-seller库中;

  • buyer库通过buyer_uid分库,seller库通过seller_uid分库,前者满足oid和buyer_uid的查询需求,后者满足seller_uid的查询需求;

数据冗余的方法有很多种:

  • 服务同步双写;

  • 服务异步双写;

  • 线下异步双写(上图所示,是线下异步双写);

要点四:数据冗余,是解决"多对多"业务,数据库水平切分的常见方案。

不管哪种方案,因为两步操作不能保证原子性,总有出现数据不一致的可能,高吞吐分布式事务是业内尚未解决的难题,此时的架构方向,是最终一致性,并不是完全保证数据的一致,而是尽早的发现不一致,并修复不一致。

要点五:最终一致性,是高吞吐互联网业务一致性的常用实践。

保证冗余数据最终一致的常见方案有三种:

  • 冗余数据全量定时扫描;

  • 冗余数据增量日志扫描;

  • 冗余数据线上消息实时检测;

那如果oid/buyer_uid/seller_uid同时存在呢?

综合上面的解决方案即可:

  • 如果没有seller_uid,"多key"业务会蜕化为"1对多"业务,此时应该使用"基因法"分库:使用buyer_uid分库,在oid中加入分库基因;

  • 如果没有oid,"多key"业务会蜕化为"多对多"业务,此时应该使用"数据冗余法"分库:使用buyer_uid和seller_uid来分别分库,冗余数据,满足不同属性上的查询需求;

  • 如果oid/buyer_uid/seller_uid同时存在,可以使用上述两种方案的综合方案,来解决"多key"业务的数据库水平切分难题;

要点总结

  • 前后台差异化需求,可使用前台与后台分离的架构设计;

  • 对于复杂系统设计,应该逐个击破;

  • 基因法,是解决"1对多"业务,数据库水平切分的常见方案;

  • 数据冗余,是解决"多对多"业务,数据库水平切分的常见方案;

  • 最终一致性,是高吞吐互联网业务一致性的常用实践。

【本文为51CTO专栏作者"58沈剑"原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

到此,关于"订单中心,1亿数据架构,这次服了"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 订单 业务 查询 需求 分库 一致 基因 架构 冗余 后台 数据库 方案 前台 水平 设计 一致性 用户 服务 上图 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法解读课件 北京网络服务器机柜品牌 服务器加内存条对电脑有什么影响 山东人工智能软件开发定制费用 卫生部数据库 数据库 des 加密 mis类软件开发 软件开发专科 北京塔式服务器公司云主机 克拉玛依软件开发销售电话 王者如何查看有账号的服务器 家长如何加强中学生网络安全 网络安全特色儿童一等奖画 手机红包软件开发 英语对话讨论网络安全问题 服务器怎么设置全局管理 数据库有哪些gb规范引用 原神亚服服务器切换 工程分包管理软件开发方案 学生管理系统数据库关系图 河南能源化工集团网络安全运维 个人如何接软件开发业务 达梦数据库查看归档日志 网络安全教育视频 小学生 超级好看的网络安全的手抄报 频繁计算需要存到数据库吗 银行端社保软件开发需求 奶牛网络技术有限公司 安顺网络安全系统哪家好 雨天视频软件开发
0