泛谈阿里vs美团订单存储架构演进

news2024/12/24 10:03:34

泛谈阿里vs美团订单存储架构演进

1. 订单存储介绍

  • 订单的存储背后支撑创单后的系列用户活动,围绕着业务的发展,大厂的订单的数据日益剧增

  • 在手淘订单列表,我们可以看见天猫、飞猪、淘票票等诸多 BU 的订单

  • 在美团的订单列表,我们可以看见火车票、酒店、美团优选等诸多业务的订单信息

  • 如何保障在大数据量的情况,用户或者商家依然可以丝滑查出自己的订单,以及在未来业务的进一步发展中,订单的存储架构是否可以做到平滑升级,在技术上是一个极大挑战

  • 在本文中,我们泛谈一下阿里VS美团的订单存储架构,希望对阅读文章的你在日常工作中、跳槽面试中有所帮助

2. 美团外卖订单存储演进

2.1 订单存储

  • 美团外卖,送啥都快

  • 小时候幻想黄袍加身,35 岁以后,实现了小时候的梦想

  • 美团外卖从 2013 年 9 月的第一单成交以来,三个年头过去了,目前美团外卖发展为日均 500 万单,还不包括其他业务的单量,如果仅单库单表,肯定无法支撑如今美团的业务发展

  • 众所周知,我们有句老话,时间就是金钱。在订单存储方面,美团大胆采用了 “钱换时间” 的设计架构

  • 在订单爆炸增长的阶段,美团的技术人员采取了第一步 以 buyerId,用户纬度进行水平分表,用户进入订单列表查询的时候,可以迅速基于自身 ID 查询到自己的订单信息

  • 订单继续增长中,美团的商家也有这样的诉求,我想按周、按月、按年度查询自己的售卖数据,但是利用商家 ID 查询非常的慢,因为此时仅以用户纬度进行分片,商家的数据分散在各个不同的节点中,所以需要进行全量表查询,才可得出该商家的数据,那么此时美团的技术人员采取了第二步,以 sellerId,门店纬度进行水平分表,支撑商家的数据查询

  • 订单继续增长中,业务中,以 orderId,订单纬度进行查询的诉求也日益增长,照葫芦画瓢,美团的技术人员采取了第三部,以 ordreId,订单纬度进行水平分表,支撑直接的订单查询

在这里插入图片描述

  • 订单进行分表之后,对于上述纬度,可以进行一个快速的订单得到,但是存在其他的纬度,比如用户手机号、某外卖品类查询、洗脚店顾客男女占比,这些复杂查询如何实现呢?于是美团的技术人员冗余了第四份数据,通过 es 来解决分库分表后复杂查询的效率问题
  • 当然针对三个月前的数据,会使用* HBase 回流到历史库,但是 HBase 存在的一个问题就是,压缩存储后,无法进行顺序时间排序展示(目前暂不清楚美团内部如何处理,未在网上找到相关资料~)
  • 所以总结下来,对于一份美团的订单,分别按照订单ID、用户ID、门店ID 以一定的规则存储在每个纬度不同的分片的 Mysql 中,同时 ES 中继续冗余一份数据,作为复杂查询的数据源

2.2 数据一致性

  • 冗余 4 份数据后,美团如何保证每一份的数据都是完整的呢,在用户下单的那一刻一定要 4 份数据写入成功后,才算成功吗? 答案,显然不是,在用户下单那一刻,美团会保证写入以用户ID 纬度的分片表中,该表写入成功即返回成功,然后通过 databus 同步到其他纬度的数据表,保证最终一致性即可
  • 这时候,有好奇宝宝举手问了,假设我利用 databus 同步失败了,如何保证这个最终一致性呢,所以此时我们需要重试 + 补偿 来保障强一致性,通常情况下我们会利用 本地消息表 来保障强一致性
  • 这时候,另外一位好奇宝宝提问了,我下单后涉及到了库存、优惠资格等多个资源吗,下单时会首先预占资源,下单失败后会释放资源,此时我的订单写入和其他的系统如何保持一致性呢?既如何在分布式系统中,保障一致性呢,在 美团 采取的是 2PC 方案
  • 2pc 方案示例图如下

在这里插入图片描述

2.3 平滑扩容方案

  • 未来业务会进一步的发展,那么美团现有架构是什么,是否具备平滑扩容能力?

  • 目前美团内部具有的一个框架为 DB Proxy,db 代理层

  • 主要分为三层,第一层:权限校验;第二层:DBSQL 分析;第三层:DB 连接层

  • 第一层,权限校验,主要 针对大商家的查询,因为大商家容易造成数据的倾斜,所以特例特管,在该层将特定商家路由到特定的数据库节点

  • 第二层,DBSQL 分析,该层主要进行 SQL 的分析,主要分析在 join 语句查询的时候,涉及的表是否在同一数据库节点,如果在同一数据节点,则进行下放查询,否则需要进行拆分查询,当然针对于部分小表,可使用广播表,在每个节点都进行冗余,sharding jdbc 插件提供了该能力支持

  • 第三层:DB 连接层,该层为线程池连接层,将所有的数据进行连接汇总

  • 通过该架构的分析,据目前资料了解,美团内部暂时未有统一的平滑扩容方案

3. 淘宝订单存储演进

3.1 订单存储

  • 淘宝从 2003 年成立至今,近 21 年的时间,流量不断增加,每天的实物和虚拟商品的交易达到了亿级别,每次交易都会涉及到商品的信息查询,订单的创建、优惠的扣减、订单的支付等等,每一个环节都涉及到数据库的记录创建或者查询、更新
  • 尤其交易订单,更是用户下单过程中的重中之重
  • 在淘宝起步阶段,系统是从老外那买的,使用的数据库为 Oracle 数据库,存储着所有的订单信息,订单的创建和历史订单的查询都是在同一数据库中查询
  • 随着互联网的发展,单一的数据库已经无法支撑业务的前进,于是对交易的订单进行拆分,分为在线库以及历史库,将三个月前的历史订单迁移进历史库,但是由于数据量巨大,不能满足查询需求,因此那个阶段的用户只能查询三个月以内的订单信息
  • 为了解决存储成本,以及历史订单的问题,淘宝将历史订单迁移到 HBase 数据库,整体方案上,没有采取美团那样财大气粗的冗余数据方案,整体方案采用主表 + 索引表,索引表是什么概念呢,索引表可能存在 userId、orderId 、分片位置,通过 userId 我们可以迅速得到一些常用属性信息,而无需进行二次查询。你熟悉吗?对,就是借助了 Mysql 中的覆盖索引思想。但是该方案存在的弊端在于,订单不一定按照时间顺序迁移到历史的订单库,很多类型的订单并不迁移到历史订单库,未完结的订单、退款中的订单、售后处理中的订单等等,所以会导致订单列表不是严格按照时间排序,用户可能发现自己的近期订单出现在不正确的位置
  • 于是针对历史的订单开始采取自研的基于 X-Engine 引擎的 PolarDB-X 集群,进一步压缩了存储成本,也解决了订单乱序的问题。当然在线库依旧采取的是 Mysql 集群(InnoDb 引擎),但是只保存最近 90 天的订单数据,数据量少,可以保证较高的缓存命中率,确保读写延时,通过数据同步将在线库中的 90 天以上的订单迁移到历史库中,并从在线库中删除,历史库的存储引擎已切换为 X-Engine,保存超过 90 天的所有交易订单的数据,超过 90 天的订单读写,直接操作历史库。

在这里插入图片描述

3.2 平滑扩容方案

  • PolarDB 提供了一套系统性的扩容方案

  • PolarDB-X 1.0扩容原理步骤如下:

    • 创建扩容计划
    • 选择新增加RDS/PolarDB MySQL,并选定需要迁移到新RDS/PolarDB MySQL实例上的分库,提交任务后系统自动在目标RDS/PolarDB MySQL上创建数据库和账号,并提交任务进行数据迁移同步。
    • 全量迁移
    • 系统选择当前时间之前的一个时间点,将这个时间点之前的数据进行全量的数据复制迁移。
    • 增量数据同步
    • 完成全量迁移后,基于全量迁移开始之前时间点的增量变更日志进行增量同步,最终原分库和目标分库数据实时同步。
    • 数据校验
    • 增量达到准实时同步后,系统自动做全数据校验,并且订正因为同步延迟造成的不一致数据。
    • 应用停写和路由切换
    • 校验完成后,并且增量依然维持准实时同步,业务选定时间进行切换,为确保数据严格一致,建议应用停服(也可以不停,但可能面临同一条数据高并发写入覆盖问题),引擎层进行分库规则的路由切换,将后续流量转向新库,切换过程秒级完成。

在这里插入图片描述

4. 总结

  • 泛谈完美团和阿里的订单存储,无论是美团的4份数据的冗余,还是阿里的全局二级索引,都有我们值得借鉴的思想

  • 在当下的最好的设计不一定是未来的最好设计。往前走可能有更大的苹果,或者可能在我们未来看的这一部分代码,比如美团的设计,你或许会不理解,但是当时的这个方案一定是为了兼容业务 或者 时间的问题。存在即合理。辩证的眼光看待设计,取其精华,去其糟粕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python学习日记-46] Python 中第三方开源模块的安装、使用与上传自己写的模块

[Python学习日记-46] Python 中第三方开源模块的安装、使用与上传自己写的模块 简介 下载与安装 如何使用安装好的第三方开源模块 如何上传自己写的模块到 PyPi 简介 在前面的模块介绍和导入当中主要介绍的都是 Python 内置的一些模块,我们把它称为标准库&#…

string模拟优化和vector使用

1.简单介绍编码 utf_8变长编码,常用英文字母使用1个字节,对于其它语言可能2到14,大部分编码是utf_8,char_16是编码为utf_16, char_32是编码为utf_32, wchar_t是宽字符的, utf_16是大小为俩个字节&a…

在线书画展:艺术与科技携手,拓宽艺术之路

在数字化浪潮的推动下,在线书画展正成为艺术与科技完美融合的典范。它不仅拓宽了艺术的传播渠道,提升了个人书画家的开展效率,还促进了艺术家们的职业发展。以下是对在线书画展几大优势的深入探讨。 一、拓宽艺术传播渠道 全球化展示&#x…

前端开发笔记--html 黑马程序员2

文章目录 前端常用标签一、标题标签二、段落标签和换行标签和水平线标签三、文本格式化标签![请添加图片描述](https://i-blog.csdnimg.cn/direct/87583fa23fe04229b016912051f3fc45.png)四、盒子标签五、图像标签六、连接标签七、注释和特殊字符 八、表格标签的基本使用九、列…

图书馆自习室座位预约管理微信小程序+ssm(lw+演示+源码+运行)

摘 要 随着电子商务快速发展世界各地区,各个高校对图书馆也起来越重视.图书馆代表着一间学校或者地区的文化标志,因为图书馆丰富的图书资源能够带给我们重要的信息资源,图书馆管理系统是学校管理机制重要的一环,,面对这一世界性的新动向和新…

Python | Leetcode Python题解之第475题供暖器

题目&#xff1a; 题解&#xff1a; class Solution:def findRadius(self, houses: List[int], heaters: List[int]) -> int:ans 0houses.sort()heaters.sort()j 0for i, house in enumerate(houses):curDistance abs(house - heaters[j])while j 1 < len(heaters) …

计算机网络——运输层(可靠传输、超时重传、选择确认、流量控制和拥塞控制、TCP连接和释放)

TCP可靠传输的实现 我们假定数据传输只在一个方向进行&#xff0c;即A发送数据&#xff0c;B给出确认。这样的好处是使讨论限于两个窗口&#xff0c;即发送方A的发送窗口和接收方B的接收窗口。 以字节为单位滑动窗口 发送方构造窗口 窗口前沿和后沿的移动情况 描述发送窗口的状…

《使用Gin框架构建分布式应用》阅读笔记:p1-p19

《使用Gin框架构建分布式应用》学习第1天&#xff0c;p1-p19总结&#xff0c;总计19页。 一、技术总结 1.go get & go install 执行go get 或者 go install 命令后package会被安装到哪里&#xff1f;参考&#xff1a;https://go.dev/ref/mod#go-install VSCode结合WSL使…

springboot001基于SpringBoot的在线拍卖系统(论文+源码)_kaic

医护人员排班系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足&#xff0c;创建了一个计算机管理医护人员排班系统的方案。文章介绍了医…

C++多线程的Demo(二)

前言 接上文&#xff0c;这次对C多线程和并发有了一些粗浅的理解&#xff0c;上一篇文章如下&#xff1a; C多线程的Demo&#xff08;一&#xff09;_c demo-CSDN博客 详细讲解join()和detach(): 每一个程序至少拥有一个线程&#xff0c;那就是执行main()函数的主线程&#xf…

python 画图|三维散点图输出

【1】引言 在前述学习进程中&#xff0c;已经初步掌握三维动画输出和散点图动画输出基本技能&#xff0c;可通过下述链接直达&#xff1a; python画图|散点图动态输出-CSDN博客 python动画教程|Animations using Matplotlib-官网教程程序解读_如何用python制作微动画-CSDN博…

【实时计算 Flink】DataStream作业大状态导致反压的调优原理与方法

状态管理不仅影响应用的性能&#xff0c;还关系到系统的稳定性和资源的有效利用。如果状态管理不当&#xff0c;可能会导致性能下降、资源耗尽&#xff0c;甚至系统崩溃。Flink Datastream API在状态管理方面提供了非常灵活的接口&#xff0c;您可以采取相关措施来确保状态大小…

Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案

解决方案 一、首先确定自己电脑的位数&#xff08;这里默认大家的电脑都是64位&#xff09;二、右击MathType桌面图标&#xff0c;点击“打开文件所在位置”&#xff0c;然后分别找到MathPage.WLL三、把这个文件复制到该目录下&#xff1a;C:\Program Files\Microsoft Office\r…

Ubuntu 详解| Ubuntu ssh| Ubuntu apt命令大全| Ubuntu性能优化| Ubuntu换镜像源

Ubuntu 是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 和它一样的还有 kali&#xff08;一款渗透测试软件&#xff09; Debian-kali 小白参考 &#xff1a;Centos 7.9 安装 图解版 小白必看 最新_centos7.9-CSDN博客文章浏览阅读2.5k次&#xff0c;点赞…

vue3.0 + vite:中使用 sass

1、安装依赖 npm i sass sass-loader --save-dev 在项目的src/assets文件夹下新建style/index.scss 文件 2、在 vite.config.ts 中加&#xff1a; resolve: {alias: {: fileURLToPath(new URL(./src, import.meta.url))} }, css: {// 配置 SCSS 支持preprocessorOptions: {s…

Mybatis Plus连接使用ClickHouse也如此简单

通过阅读列式数据库ClickHouse官网&#xff0c;不难看出它有支持JDBC规范的驱动jar包&#xff0c;可以直接集成到Object Relational Mapping框架等&#xff0c;下面我用SpringBootMybatisPlus环境连接ClickHouse来演示一下 集成步骤 1.Maven引入ClickHouse提供的JDBC依赖 <…

解决海外社媒风控问题的工具——云手机

随着中国企业逐步进入海外市场&#xff0c;海外社交媒体的风控问题严重影响了企业的推广效果与账号运营。这种背景下&#xff0c;云手机作为一种新型技术解决方案&#xff0c;正日益成为企业应对海外社媒风控的重要工具。 由于海外社媒的严格监控&#xff0c;企业经常面临账号流…

linux驱动-platform子系统

目录 1.传统字符设备驱动框架的缺点 2.总线、设备、驱动 3.设备注册 4.驱动注册 1.传统字符设备驱动框架的缺点 缺点&#xff1a;驱动可移植性差&#xff0c;原因是驱动里面包括了很多该芯片特有的消息&#xff0c;如果是其他平台&#xff0c;硬件信息会有差异&#xff0c;…

七、Linux 之用户管理

基本介绍 Linux 系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统 添加用户 useradd 用户名添加一个用户 milan, 默认该用户的家目录在 /home/milan 细节说…

深入Postman- 自动化篇

前言 在前两篇博文《Postman使用 - 基础篇》《玩转Postman:进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支…