当前位置: 首页 > news >正文

架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计

文章目录

  • 引言
  • 一、初创互联网公司架构演化案例
    • 1. 万级日订单级别架构
    • 2. 十万级日订单级别架构
    • 3. 百万级日订单级别架构
  • 二、分布式存储系统 Doris 架构案例
  • 三、反应式编程框架架构案例
  • 总结

在这里插入图片描述

引言

分布式架构

今天我们将探讨三种不同类型的架构案例,分别探讨

  • 一个初创互联网公司如何从简单架构发展到百万级订单的架构演化
  • 一个分布式存储系统(Doris)的架构设计
  • 一个反应式编程框架的架构设计

这三类架构代表了不同领域和技术背景下的架构设计,分别考验着架构师在不同场景下的技术能力和架构思维。


一、初创互联网公司架构演化案例

1. 万级日订单级别架构

在初创互联网公司开始时,系统架构较为简单。系统主要包括前端(移动端应用)通过负载均衡访问 Web 服务器集群,前端服务器再将请求分发到应用服务器集群。每个应用服务器集群(买家系统、卖家系统、供应链系统和运营系统)连接到一台 MySQL 服务器。当订单量达到万级时,架构仍能承受高负载,但随着交易活跃度的增加,系统开始暴露出性能瓶颈。

在这里插入图片描述


2. 十万级日订单级别架构

随着订单量的增加,系统架构经历了一次重构。引入了 CDN 服务来加速静态资源的加载,使用分布式文件系统管理商品图片,提高了访问效率。同时,添加了 Redis 集群用于缓存,优化了数据存取速度。数据库也进行了主从分离,读写分离和数据分析分离,以减轻数据库压力。大数据平台通过 Kafka 消息队列与 MySQL 数据库进行数据同步,支撑着更复杂的统计分析与运营需求。

在这里插入图片描述


3. 百万级日订单级别架构

当订单量突破百万级时,主要的挑战来自于复杂的业务和庞大的数据存储需求。为了解决这些问题,系统进行了微服务化重构,把一些独立的业务模块拆分成单独的服务,进行分布式部署,这大大简化了功能扩展与维护。数据库的冷热分离进一步提升了性能,将已完成的订单数据迁移到 MongoDB 中,减轻 MySQL 的存储压力。微服务架构不仅提升了系统的可扩展性,还提升了团队开发效率。

在这里插入图片描述

微服务拆分

一方面是做了一个微服务方面的重构拆分,将可复用的一些业务拆分为独立的微服务,进行分布式部署,供应用系统调用,典型的就是用户服务、商品服务、订单服务、红包服务等。以前红包作为一个功能,在各个应用系统中可能都有涉及,买家需要使用红包,卖家要发放红包,而运营系统也可能发放系统级的红包,而这些红包的功能在各个子系统都有存在,所以对红包功能进行维护修改的时候,可能在很多个系统都要进行相关的代码变更和维护。产品经理需要跟几个系统开发团队进行合作,开发一个功能一不小心就可能会产生Bug。

重构以后,红包服务作为一个独立的功能,独立部署,其他的所有系统都通过远程调用的方式访问红包服务。红包的发放使用,以及红包的各种记录都通过红包服务进行管理,其他的应用只需要调用服务接口就可以了。如果要修改红包服务相关的功能,进行业务变更,那么大多数情况下只需要修改红包服务就可以。这样使业务系统开发变得更加的简单,因为红包功能相对比较集中,也更容易实施和落地。

数据库冷热分离

另一方面是,对数据库在原来的主从分离的基础上又做了一次冷热分离。因为我们刚才提到经过主从分离后的数据库,读写访问压力已经可以接受,这时候,主要压力来自于订单的持续不断增长和数据表记录的不断扩展,带来的存储方面的压力。而订单的一个特点是当订单已经完成,订单状态被关闭以后,订单就是只读的。这个时候只需要能够对订单提供查询、读服务就可以了,无需为它提供事务性写操作,那么我们就可以从比较宝贵的 MySQL 数据库资源中,把这些已经关闭了的订单分离出来,存储到更容易进行分步式存储的其他的 NoSQL 系统上。

可以选择MongoDB 作为订单数据的冷存储。每天夜里运行批处理任务,执行一个冷订单备份的迁移操作,将已经关闭一个月以上的订单数据,从 MySQL 数据库中迁移到了 MongoDB 中。而订单服务在进行订单操作的时候,所有的写操作依然访问 MySQL 数据库。对于读操作,如果要是查询一个月以内的订单,也还是访问 MySQL 从数据库,而如果是需要查询一个月以上的订单,那么就访问 MongoDB 数据库就好了。

通过这样一个冷热分离来设计数据库,只存储最近一个月的数据,存储访问的压力、数据存储的压力大大的减轻。


二、分布式存储系统 Doris 架构案例

Doris 是一个高性能的分布式存储系统,其设计目标主要包括高可用、线性伸缩、高性能以及低运维成本。

在这里插入图片描述

Doris 的架构包括三个主要部分:

  • 客户端(KV Client):应用程序通过 Doris SDK 进行数据的读写操作。客户端连接到集群的控制中心,获取配置信息,并根据路由算法将数据请求发送到具体的存储节点。

  • 控制中心(Administration):负责集群的故障管理和扩容管理,确保系统的高可用性。

  • 数据存储(Data Server):Doris 的数据存储采用分片存储,并通过一致性哈希和虚拟节点结合的路由算法来实现数据均匀分布。在扩容时,只需要调整虚拟节点和物理节点之间的映射关系,大大降低了集群扩容的复杂性。

Doris 提供高可用性和故障容错机制。在集群发生故障时,Doris 会自动进行故障转移,保证数据的高可用性。对于临时失效(如硬件故障或程序升级),系统仍然可以保证数据的多份写入,确保数据的完整性。在永久性失效的情况下,Doris 会通过恢复正常服务器中的数据来替代失效节点,保证系统的稳定运行。


三、反应式编程框架架构案例

在这里插入图片描述

Flower 是一个基于 Akka 构建的反应式编程框架,它支持开发者使用传统的命令式编程方式构建反应式系统。Flower 具备四个主要特性:

  • 即时响应:系统可以即时响应用户请求,不会阻塞线程。
  • 回弹性:系统能够自我修复,当部分功能失效时,系统仍能正常运行。
  • 弹性:系统根据负载自动伸缩,适应不同的请求压力。
  • 消息驱动:服务之间通过异步消息进行驱动,避免了阻塞式的同步调用。
    在这里插入图片描述

Flower 的设计目标是使开发者能够更容易地创建反应式系统,而无需深入了解反应式编程的细节。与传统的阻塞式编程不同,Flower 使用有限数量的线程处理大量并发请求,极大提高了吞吐量和响应时间。Flower 的服务之间通过异步消息传递,利用 Akka 的 Actor 模型来实现非阻塞的消息处理。异步数据库驱动让数据库操作不会阻塞线程,进一步提高了系统的效率。

在高并发情况下,Flower 能够通过少量的线程处理大量的用户请求,避免了传统阻塞式编程中因线程资源耗尽导致的性能瓶颈。通过这种设计,Flower 能够显著提升系统的吞吐量和响应能力,适应更高的业务需求。


总结

通过这三个架构案例,我们可以看到架构设计如何随着业务的增长和需求的变化而不断演化:

  1. 互联网应用架构的演化:从简单的单一系统架构到复杂的微服务架构和分布式数据库设计,架构的变化反映了业务的成长和技术的不断创新。
  2. 分布式存储系统设计:通过合理的分区算法和高可用设计,Doris 展示了如何构建一个既高效又易于扩展的分布式存储系统。
  3. 反应式编程框架设计:Flower 提供了一个易于使用的反应式编程框架,帮助开发者构建非阻塞、高吞吐量的系统。

这三个案例从不同角度展现了架构设计的复杂性与灵活性,同时也为架构师提供了多样的架构设计思路。在日常工作中,架构师需要灵活应对不同的需求与挑战,设计出既能满足当前业务需求,又具备良好扩展性的架构。

在这里插入图片描述

相关文章:

架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计

文章目录 引言一、初创互联网公司架构演化案例1. 万级日订单级别架构2. 十万级日订单级别架构3. 百万级日订单级别架构 二、分布式存储系统 Doris 架构案例三、反应式编程框架架构案例总结 引言 分布式架构 今天我们将探讨三种不同类型的架构案例,分别探讨 一个初…...

51页精品PPT | 农产品区块链溯源信息化平台整体解决方案

PPT展示了一个基于区块链技术的农产品溯源信息化平台的整体解决方案。它从建设背景和需求分析出发,强调了农产品质量安全溯源的重要性以及国际国内的相关政策要求,指出了食品安全问题在流通环节中的根源。方案提出了全面感知、责任到人、定期考核和追溯反…...

【Pytest】setup和teardown的四个级别

文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中,setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…...

JavaScript系列03-异步编程全解析

本文介绍了异步相关的内容,包括: 回调函数与回调地狱Promise详解async/await语法Generator函数事件循环机制异步编程最佳实践 1、回调函数与回调地狱 JavaScript最初是为处理网页交互而设计的语言,异步编程是其核心特性之一。最早的异步编…...

Linux学习——退出vi编辑模式

初学Linux的时候,在使用vi 操作时候,有时候可能进入的是一个文件夹,这样子在退出的时候很不好操作! 下面总结一些vi 退出命令,学习! 进入编辑模式,按 o 进行编辑 编辑结束,按ESC 键 跳到命令…...

第2章_保护您的第一个应用程序

第2章_保护您的第一个应用程序 在本章中,您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣,您将运行的示例应用程序由两部分组成,前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证&#xff0…...

【AGI】DeepSeek开源周:The whale is making waves!

DeepSeek开源周:The whale is making waves! 思维火花引言一、DeepSeek模型体系的技术演进1. 通用语言模型:DeepSeek-V3系列2. 推理优化模型:DeepSeek-R1系列3. 多模态模型:Janus系列 二、开源周三大工具库的技术解析1…...

Unity中动态切换光照贴图的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

第三十四:6.4.【v-model】

6.4.【v-model】&#xff1a;双向绑定 概述&#xff1a;实现 父↔子 之间相互通信。 前序知识 —— v-model的本质 <!-- 使用v-model指令 --> <input type"text" v-model"userName"> ​ <!-- v-model的本质是下面这行代码 --> <inpu…...

React底层常见的设计模式

在React中&#xff0c;常见的设计模式为开发者提供了结构化和可重用的解决方案&#xff0c;有助于提高代码的可维护性和可扩展性。以下是对React中几种常见设计模式的详细解析&#xff0c;并附上示例代码和注释&#xff1a; 1. 容器组件与展示组件模式&#xff08;Container/P…...

从零基础到通过考试

1. 学习资源与实践平台 使用Proving Grounds进行靶机练习 OSCP的备考过程中&#xff0c;实战练习占据了非常重要的地位。Proving Grounds&#xff08;PG&#xff09;是一个由Offensive Security提供的练习平台&#xff0c;拥有152个靶机&#xff0c;涵盖了从基础到进阶的多种…...

UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异

文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…...

【无标题】ABP更换MySql数据库

原因&#xff1a;ABP默认使用的数据库是sqlServer&#xff0c;本地没有安装sqlServer&#xff0c;安装的是mysql&#xff0c;需要更换数据库 ABP版本&#xff1a;9.0 此处以官网TodoApp项目为例 打开EntityFrameworkCore程序集&#xff0c;可以看到默认使用的是sqlServer&…...

大模型微调入门(Transformers + Pytorch)

目标 输入&#xff1a;你是谁&#xff1f; 输出&#xff1a;我们预训练的名字。 训练 为了性能好下载小参数模型&#xff0c;普通机器都能运行。 下载模型 # 方式1&#xff1a;使用魔搭社区SDK 下载 # down_deepseek.py from modelscope import snapshot_download model_…...

【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)

本文项目编号 T 222 &#xff0c;文末自助获取源码 \color{red}{T222&#xff0c;文末自助获取源码} T222&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

在线会议时, 笔记本电脑的麦克风收音效果差是为什么

背景 最近在线面试. 使用腾讯会议或者飞书, 戴耳机参加在线面试, 遇到好几个面试官说我的音质不好. 一直没在意, 后来反思, 应该是电脑哪里出了问题. 排查 先买了一副品牌有线耳机, 测试后本地录制的声音仍然品质很差去掉耳机延长线后, 麦克风品质仍然很差最终找到答案, 原…...

理解文件系统

目录 文件系统 内存文件与磁盘文件的区别 初识inode 磁盘的概念 磁盘分区与格式化介绍 EXT2文件系统的存储方案 软硬链接 软连接 ​编辑 硬链接 软硬链接的区别 文件的三个时间 文件系统 内存文件与磁盘文件的区别 我们知道文件可以分为磁盘文件和内存文件&#…...

第二十四:5.2【搭建 pinia 环境】axios 异步调用数据

第一步安装&#xff1a;npm install pinia 第二步&#xff1a;操作src/main.ts 改变里面的值的信息&#xff1a; <div class"count"><h2>当前求和为&#xff1a;{{ sum }}</h2><select v-model.number"n">  // .number 这里是…...

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 3.文件预览 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 一、需求背景 在一个愉快的年后&#xff…...

C# 装箱(Boxing)与拆箱(Unboxing)

C# 装箱&#xff08;Boxing&#xff09;与拆箱&#xff08;Unboxing&#xff09; 在 C# 中&#xff0c;装箱和拆箱是与值类型&#xff08;如结构体&#xff09;和引用类型&#xff08;如类&#xff09;之间的转换相关的操作。它们是类型系统的一部分&#xff0c;但如果不正确使…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...