【高并发写】库存系统设计

news2024/9/28 5:30:31

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!

免责声明~

任何文章不要过度深思!

万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」

不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人

怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

949cfd5b1da5c088387a6e70a3662f86.jpeg

当 DoorDash 从订购餐饮向便利店和杂货(CnG)业务转型时,他们必须找到一种方法来管理每个商户每个店铺的在线库存,从几十种商品增加到数万种商品。

为了解决这个扩展问题,他们的团队构建了一个高写入量的库存平台,它将能够跟上平台上的所有更改。

0 大纲

  1. 支持 CnG 库存管理的挑战

  2. 他们理想库存平台的技术需求

  3. 功能架构

  4. MVP 后对解决方案的增量更改 —— 将单个商品 API 更改为批量 API —— 数据库表优化 —— 在一个请求中批量上传 CockroachDB 的数据库

  5. 结论

1 支持 CnG 库存系统的挑战

DoorDash 每天以三种不同方式多次刷新 CnG 商户的库存:

  • 通过摄入从商户接收的平面库存文件自动更新

  • 他们的运营团队通过内部工具加载库存数据

  • 通过在 CnG 商店购物的 Dash 运送应用中的信号更新库存

由于 CnG 商店的数量数万家,且每家商店可能包含数万种商品,刷新可能每天涉及超过 10 亿件商品。

2 期望的库存平台的技术需求

2.1 高可扩展性

随着他们的业务增长,库存平台需要支持更多添加到系统中的商品。需要支持频繁的更新,以保持库存的新鲜度

2.2 高可靠性

流水线应该可靠,以便所有来自商户的有效库存更新请求最终都能成功处理

2.3 低延迟

商品数据非常敏感,特别是价格和可用性属性。从获取商业数据到向客户显示数据之间的时间间隔应尽可能小。

2.4 高可观察性

流水线应具有大量验证和防护栏。

3 功能架构

从他们的库存摄入管道的高级体系结构开始。

下图显示他们库存摄入流水线的顶层设计,一个异步系统,从多个不同来源摄入库存,对其进行处理并传递给下游系统,在那里为面向客户的实体提供视图。

329a1a1993a4edaf6f0b1e6b1e0ee75d.png
  1. API controller,基于 gRPC 的 API 控制器,充当平台上库存数据的入口点。

  2. Raw Feed Persistence —— API 控制器之后的大部分库存处理都是异步的,并通过 Cadence 工作流执行的。

  3. Hydration—— 商店商品的详细视图涉及库存和目录属性。DoorDash 的库存摄入管道负责给(即富集)原始库存信息添加目录属性。

  4. 价格计算 —— 他们还依赖从依赖服务获取的外部配置按需执行每件商品的价格计算。

  5. 无库存预测分类 —— 预测模型,通过学习历史订单和 INF(商品未找到)数据,对商品是否可以在店内提供进行分类。

  6. Guardrails—— 没有管道不会由于代码错误在他们自己的系统和/或上游系统中的问题而导致错误。当满足某些条件时,库存平台需要建立尽力而为的防护栏(和报警机制)来检测和限制更新。

  7. 可观察性 —— 在商品层面及商店层面(聚合统计数据)都能完全看到此管道非常重要。我们需要知道是否由于管道中的某些错误而丢弃了某个商品,因为这直接与商品在商店页面上不可用有关。

  8. 可靠性 —— 由于大量的计算和依赖服务,他们的库存管道需要是异步的。Cadence 是一种无故障和有状态的工作流编排器,满足了他们的这一职责。

4  MVP 后的解决方案的增量更改

4.1 将单个商品 API 更改为批量 API

  • MVP 版本,构建了一个单个商品的 API,要创建/更新一个商品,调用者需要调用他们的 API 一次。

  • 如果一个商店有 N 个商品,调用者将需要调用 N 次 API,这可并行发生

  • 让我们再次考虑用例:当他们更新一个商店时,调用者已经知道完整的商品列表,他们可以通过一次 API 调用发送完整的商品列表。最常见的用例将使其可以批量商品并在一次请求中将它们发送到他们的服务。他们的服务可以将有效负载保存到 S3 并通过 Cadence 作业异步消耗它。

ef13f965d6c0a7018cb3951c8dbefb7b.png

改为批量 API 后,观察到处理速度有所改进,但仍需达期望水平。

4.2 数据库表优化

随着他们在每个步骤上添加更多指标,他们发现数据库访问是一个重要的瓶颈:

  • 选择自然主键而不是自动递增主键 —自然复合键帮助他们更有效减少列和查询

  • 清理数据库索引 —为所有查询添加缺失的索引并删除不必要索引

  • 减少列数 —表最初有约 40 列,大多数情况,所有列都可同时更新。因此,他们决定将一些频繁更新列放入一个 JSONB 列

  • 为快速增长的表配置TTL — 为保持数据库容量和后续查询负载在可控范围,确定了一些高强度写入的表,这些表不需要保存太长时间数据,并在 CockroachDB 中为这些表添加TTL配置

  • 数据库和依赖检索逻辑从商品级别修改为商店级别 —要更新一个商品,需从商店级别和商品级别获取大量信息,如商店级通货膨胀率和商品级目录数据。选择按需获取该信息,因为正在处理每个商品。通过这样做,他们可以为下游服务和数据库节省大量 QPS,并为他们的系统以及他们的系统改善性能

c6117564c9e62680b5b88380304c3766.png

4.3 在一个请求中将数据库插入批量化到CockroachDB

每次完成商品级处理后,都通过使用单商品插入将结果保存到数据库中——这在数据库中造成非常高 QPS。

与存储团队讨论后,建议批量 SQL 请求。因此调整体系结构:

  • 在完成每个商品处理后,收集结果并将其保存在进程的内存

  • 然后将查询聚合为每批 1,000 个,并在一个 SQL 请求中发送批处理

727f5ece12c572ee9f4b33191b28d821.png

修改查询重写后,观察到应用层和存储层的服务性能显著提高:

  • 每件商品的处理时间减少了 75%

  • 存储 QPS 下降 99%

  • 存储 CPU 利用率下降

5 总结

  • 构建和扩展数字库存很难,因为数字库存的数据大小可能巨大,同时它需要准确提供正确的实时库存视图

  • 而且它对时间也很敏感,因为一获得商品信息我们就需要向客户显示商品的正确价格和可用性

主要:

  • 在实现的开始,努力创建一个详尽的指标监控面板,以便在出现性能问题时,可轻松缩小系统的瓶颈。通常,从一开始就可以对实时系统具有高可见性非常有用

  • 可帮助读写模式的数据方式保存数据。库存数据可能不是扁平的数据列表 —— 它们可能具有一定级别层次结构。它们可保存为商品级别或商店级,这完全取决于确定服务的读写模式

  • 尽可能设计批量 API 和 DB。大多情况下,更新库存时,我们会更新一整个商店或地理位置的库存。无论哪种,都有多个要更新的商品,所以最好尝试批量更新而非每个请求或查询更新单个商品

  • 若业务部门允许异步处理,使计算异步化,并为每个单元(商店或商品)建立强大SLA。单个商品处理时间包括花费在网络通信上的时间,当有数十亿商品要处理时这些时间会积累。

  • 相反,若我们通过一个请求发送整个商店的库存,并在服务器端使用 blob 存储保存请求有效负载并异步处理,则客户端可节省等待时间,服务能具有高吞吐量

  • 从这角度看,还建立了内容将在近实时而非实时更新的想法。Cadence 是处理近实时作业的好工具,并具有许多内置功能来改进系统可靠性和效率。

参考:

  • https://doordash.engineering/2023/02/22/how-doordash-designed-a-successful-write-heavy-scalable-and-reliable-inventory-platform/?source=post_page-----61c1a5c71641--------------------------------

写在最后

编程严选网(www.javaedge.cn),程序员的终身学习网站已上线!

点击阅读原文,即可访问网站!

欢迎长按图片加好友,我会第一时间和你分享软件行业趋势面试资源学习途径等等。

7343f1c606e39c2e96593e90ee863ea4.jpeg添加好友备注【技术群交流】拉你进群,更多教程资源应有尽有

关注公众号后,在后台私信:

  • 回复【架构师】,获取架构师学习资源教程

  • 回复【面试】,获取最新最全的互联网大厂面试资料

  • 回复【简历】,获取各种样式精美、内容丰富的简历模板

  • 回复 路线图,获取直升Java P7技术管理的全网最全学习路线图

  • 回复 大数据,获取Java转型大数据研发的全网最全思维导图

  • 微信【ssshflz】私信 【副业】,进副业交流群

  • 点击阅读原文,即可访问程序员一站式学习网站

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

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

相关文章

Vue 入门指南:从零开始学习 Vue 的基础知识

🥝VUE官方文档 注意: 📒Vue 2 将于 2023 年 12 月 31 日停止维护。详见 Vue 2 延长 LTS。📒Vue 2 中文文档已迁移至 v2.cn.vuejs.org。📒想从 Vue 2 升级?请参考迁移指南。 文章目录 🍁前言&am…

后台管理系统开源项目

最近项目没有什么事做,就自己整理,修改了一些vue2,react的后台管理系统项目,方便以后有需要可以直接提取,当然也方便了大家 vue2技术栈 lyl-vueProjectAdmin: vue2后台管理系统 react技术栈 lyl-reactAdminProject:…

Vue3-基于husky的代码检查工作流

husky是一个git hooks工具(git的钩子工具,可以在特定时机执行特定的命令) 代码检查 背景:想要使代码上传到git仓库前进行代码检查,所以提前下载好git 打开项目终端,点击右上角选择进入Git Bash控制 1.如…

牛客 算法题 golang语言实现

题目 HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序 描述 输入整型数组和排序标识,对其元素按照升序或降序进行排序数据范围: 1 ≤ � ≤ 10001≤n≤1000 ,元素大小满足 0 ≤ � &#…

同为科技(TOWE)工业级炫彩桌面PDU让你的桌面更整洁

在当今社会,人们越来越注重生活品质与工作效率,桌面PDU插座是安全便捷的桌面电源设备,兼顾了工业机柜PDU功能、输出方式多样化与C端电气设备高颜值、实用性的特点,可满足消费者日常多方位用电需求。同为科技(TOWE&…

应用密码学期末复习(1)

学习资料 应用密码学总结_应用密码学知识点总结-CSDN博客 应用密码学期末复习知识点总结_5的36次方mod97__PriDe的博客-CSDN博客 【密码学】密码学期末考试速成课,不挂科!!#高数帮_哔哩哔哩_bilibili 目录 学习资料 第一章 概述 1.1信息…

vue2通过权限控制tab标签显示和隐藏

vue2通过权限控制tab标签显示和隐藏 1、前言2、v-if实现自定义控制 1、前言 在开发过程中,我们可能会遇到这样一个场景:根据不同权限对tab栏内容进行控制,这时候用自定义指令v-permission就达不到我们想要的效果,其是将当前节点的…

FinOps和DevOps的未来会怎样?

FinOps(或财务运营)是一种文化实践,它将财务责任引入云的可变支出模型。这是一种将系统、最佳实践和文化相结合的战略方法,可提高组织了解云成本并做出明智决策的能力。 本质上,FinOps 是一个管理云运营费用&#xff…

①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态

个人简介:Java领域优质创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 登录功能 实现 实现基于session的登录流程&…

「阿里巴巴」裁撤量子实验室!

据内部消息,阿里巴巴达摩院由于预算及盈利等原因,已经撤裁旗下量子实验室。此次,共计裁减30余人。 达摩院官网已撤下量子实验室的相关介绍页面。上图:早先关于量子实验室的相关介绍;下图:现在达摩院官网“实…

招标采购软件如何让采购变得更轻松?

企业总是希望让采购流程更简单,选择更好的供应商,花更少的钱。采购软件的普及使原材料和服务的采购变得更容易,向供应商(甚至是全球供应商)索取信息的流程已大大简化。包括招标采购软件在内的采购技术已成为企业运营不…

11.Spring源码解析-beans解析

很明显又调用回来了,是典型的递归调用

璞华大数据产品入选中国信通院“铸基计划”

武汉璞华大数据技术有限公司HawkEye设备数字化管理平台产品,凭借优秀的产品技术能力,通过评估后,入选中国信通院“铸基计划”《高质量数字化转型产品及服务全景图(2023)》的工业数字化领域。 “铸基计划”是中国信通院…

MySQL数据库入门到大牛_基础_17_触发器

文章目录 1. 触发器概述2. 触发器的创建2.1 创建触发器语法2.2 代码举例 3. 查看、删除触发器3.1 查看触发器3.2 删除触发器 4. 触发器的优缺点4.1 优点4.2 缺点4.3 注意点 5. 第十七章练习 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关…

文章采集器-免费的文章采集工具大全

在当今信息爆炸的时代,获取有效的信息变得尤为关键。随之而来的问题是,如何高效地从海量信息中筛选出我们所需的内容呢?文章采集器应运而生,它就像是信息世界中的一把神奇的筛子,能够帮助我们从大海一般的信息中捞取我…

linux 内核线程

内核线程类似于用户进程,通常用于并发处理些工作,它是一种在内核空间实现后台任务的方式,并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理,也可以睡眠等待某事件的发生,内核线程可以访问内核函数和…

【hive-design】hive架构详解:描述了hive架构,hive主要组件的作用、hsql在hive执行过程中的底层细节、hive各组件作用

文章目录 一. Hive Architecture二. Metastore1. Metastore Architecture2. Metastore Interface 三. Compiler四. hive架构小结 本文主要讨论了 描述了hive架构,hive主要组件的作用详细描述了hsql在hive执行过程中的底层细节描述了hive各组件作用 一. Hive Archite…

Authing CEO 谢扬来信 |我的原则

从忙碌的工作中短暂抽身,有很多感想,不吐不快,借此机会,倾我所有,诉我原则。 原则一:坚强信念,坚定意志 商人大多「无利不起早」,而创业者的反馈周期比商人长非常非常多。 相比「商品…

微服务知识大杂烩

1.什么是微服务? 微服务(Microservices)是一种软件架构风格,将一个大型应用程序划分为一组小型、自治且松耦合的服务。每个微服务负责执行特定的业务功能,并通过轻量级通信机制(如HTTP)相互协作。每个微服务可以独立开发、部署和扩展,使得应用程序更加灵活、可伸缩和可…