从零到百万用户的扩展之路

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/design-system

设计一个支持数百万用户的系统是极具挑战性的,它是一段需要持续优化和不断改进的旅程。在这篇博客中,我们将构建一个支持单个用户的系统,并逐步扩展到能够服务于数百万用户。在阅读这篇博客之后,你将掌握一些有助于破解系统设计面试题的技术。

在这段旅程中,你会学到:

  1. 初始设计:如何从一个简单的系统开始,满足最基本的用户需求。
  2. 扩展策略:使用不同的技术和架构模式来提升系统的扩展性。
  3. 性能优化:识别并解决性能瓶颈,确保系统在高负载下依然稳定高效。
  4. 容错和恢复:设计系统以应对故障,并快速恢复,保证高可用性。
  5. 监控和调试:实施有效的监控和调试策略,确保系统的健康运行。

通过这些内容,你不仅能更好地理解如何从零开始构建一个大规模系统,还能在系统设计面试中脱颖而出。接下来,我们将逐步深入探讨每个阶段的关键技术和最佳实践。

单服务器设置

千里之行,始于足下,构建一个复杂的系统也不例外。我们需要从一个简单的开始,一切都运行在一台服务器上。这一阶段的目标是构建一个功能完整、易于维护的初始系统。图1展示了单服务器设置的示意图,在这个设置中,所有东西都运行在同一台服务器上:包括Web应用、数据库、缓存等。

Maple

为了理解这一设置,研究请求流程和流量来源是很有帮助的。首先,让我们看看请求流程(图2):

Maple

  1. 用户通过域名(如 api.mysite.com)访问网站。通常,域名系统(DNS)是由第三方提供的付费服务,并不托管在我们自己的服务器上。
  2. 互联网协议(IP)地址会返回给浏览器或移动应用程序。在示例中,返回的IP地址是15.125.23.214。
  3. 一旦获得IP地址,超文本传输协议(HTTP)请求会直接发送到你的Web服务器。
  4. Web服务器返回用于渲染的HTML页面或JSON响应。

接下来,让我们来探讨流量来源。Web服务器的流量来源有两个:Web应用和移动应用。

Web应用:它使用服务器端语言(如Java、Python等)处理业务逻辑和存储等,并使用客户端语言(如HTML和JavaScript)进行展示。

移动应用:HTTP协议是移动应用和Web服务器之间的通信协议。JavaScript对象表示法(JSON)通常用作API响应格式,因为它简单易用。下面是一个JSON格式的API响应示例:

// GET /users/12 – Retrieve user object for id = 1
{
   
    "userId": 1,
    "userName": "john_doe",
    "email": "john_doe@example.com",
    "profile": {
   
        "age": 30,
        "gender": "male",
        "location": "New York"
    }
}

数据库

随着用户基础的增长,一台服务器已无法满足需求,我们需要多台服务器:一台用于处理Web/移动流量,另一台用于数据库(图3)。将Web/移动流量(Web层)和数据库(数据层)服务器分离,可以使它们独立扩展。

Maple

数据库的选择

你可以在传统的关系型数据库和非关系型数据库之间进行选择。让我们来探讨它们的区别。

关系型数据库也称为关系型数据库管理系统(RDBMS)或SQL数据库。最流行的有MySQL、Oracle数据库、PostgreSQL等。关系型数据库以表格和行的形式表示和存储数据。你可以使用SQL在不同的数据库表之间执行连接操作。

非关系型数据库也称为NoSQL数据库。流行的有CouchDB、Neo4j、Cassandra、HBase、Amazon DynamoDB等。这些数据库分为四类:键值存储、图存储、列存储和文档存储。非关系型数据库一般不支持连接操作。

对于大多数开发人员来说,关系型数据库是最佳选择,因为它们已经存在了超过40年,并且在历史上表现良好。然而,如果关系型数据库不适合你的特定用例,那么探索关系型数据库之外的选项是很重要的。非关系型数据库可能是正确的选择,如果:

  • 你的应用程序需要超低延迟。
  • 你的数据是非结构化的,或者你没有任何关系数据。
  • 你只需要序列化和反序列化数据(如JSON、XML、YAML等)。
  • 你需要存储大量数据。

关系型数据库的特点:

  1. 数据结构化
    关系型数据库使用表格来组织数据,数据结构清晰,便于管理和查询。
  2. 支持事务
    关系型数据库支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据操作的可靠性。
  3. 强大的查询能力
    使用SQL可以方便地进行复杂的查询和数据分析,支持连接操作,适合关系数据。

非关系型数据库的特点:

  1. 高性能
    非关系型数据库通常具有较低的延迟和较高的吞吐量,适合高性能需求的应用。
  2. 灵活的数据模型
    非关系型数据库支持多种数据模型,如键值对、文档、列族和图结构,适合非结构化或半结构化数据。
  3. 可扩展性
    非关系型数据库通常更容易横向扩展,可以处理大规模的数据和高并发请求。

选择合适的数据库:

  • 如果你的应用程序主要处理关系数据,并且需要执行复杂的查询和事务操作,关系型数据库是理想的选择。
  • 如果你的应用程序需要处理大量非结构化数据、高性能需求或者需要简单的键值存储,非关系型数据库可能更合适。

垂直扩展 VS 水平扩展

垂直扩展,也称为“向上扩展”(scale up),指的是通过增加服务器的处理能力(如CPU、内存等)来提升性能。水平扩展,也称为“向外扩展”(scale-out),则是通过增加更多服务器到资源池中来进行扩展。

当流量较低时,垂直扩展是一个很好的选择,其主要优势在于简单。然而,垂直扩展存在一些严重的限制:

  1. 硬性限制
    垂直扩展有一个硬性限制,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发数字药店APP实战:互联网医院系统源码详解

本篇文章,笔者将深入探讨如何开发一个功能完善的数字药店APP,并详细解析互联网医院系统的源码实现。 一、数字药店APP的需求分析 应具备以下基本功能: 用户注册与登录 药品搜索与浏览 在线下单与支付 订单管理 健康咨询与远程医疗 个人…

人脉社群平台微信小程序系统源码

🌟【解锁人脉新纪元:探索人脉社群平台小程序】🌟 🚀【开篇:为什么我们需要人脉社群平台小程序?】🚀 在这个快节奏的时代,人脉不再是简单的名片交换,而是通往成功与机遇…

发电机保护屏的作用及其重要性

发电机保护屏的作用及其重要性 发电机保护屏是电力系统中的重要组成部分,它负责监测和控制发电机的运行状态,确保发电机在正常运行和故障情况下都能得到及时、准确的保护。负责监测和控制发电机运行状态,确保及时准确的保护。它由显示屏、控制…

Nacos 2.x 系列【18】多网卡 IP 配置

文章目录 1. 前言2. 服务端3. 客户端 1. 前言 个人电脑或者服务器,存在多网卡环境时,Nacos 可能会存在IP不正确问题。 2. 服务端 Nacos 服务在启动的时候需要选择运行时使用的IP或者网卡,在启动时,可以看到打印了IP&#xff1a…

2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证试题及解析根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通…

如何在 Odoo 16 中将按钮添加到所有表单视图的操作按钮

在 Odoo 中,操作按钮是关键组件,允许用户触发与特定表单视图相关的特定操作或工作流。这些按钮策略性地放置在用户界面中,可简化操作并提高用户效率。它们可以自定义以执行各种任务,例如创建记录、更新信息或启动特定流程。 操作…

万界星空科技服装行业MES系统解决方案

据调查,我国大多数服装厂目前存在两大问题: 第一,是生产设备先进,但管理模式落后,仍采用手工管理模式,未实现信息化; 第二,仍有大量的人工站,短时间内难以用设备代替&a…

如何查看xpf文件

xpf文件是什么 XPF文件是“XML Paper Specification File”的缩写,它是一种文件保存格式,具有以下特点和相关信息: 一、定义与用途 定义:XPF文件用于保留文档的固定布局,包括文本、图片以及其他文档元素的确切位置。…

软件工程实验

实验环境和需求 用户可以对相片进行按类别管理,用户可以设定不同的类别,然后上传照片到相应的类别中,并能进行照片的删除,注释 运行 运行并访问 localhost 8090,图片在数据库中的信息是D:/upgrade 后面的内容 se…

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

一招解决 | IP地址访问怎么实现https

没有域名的情况下,使用IP地址实现HTTPS访问是可以的,但相比使用域名会有些许限制,需要通过部署专用于IP地址的SSL/TLS证书来实现。 IP地址实现HTTPS访问的过程与使用域名类似,但有几个关键的区别。以下是使用IP地址实现HTTPS访问…

day62--若依框架(基础应用篇)

若依搭建 若依版本 官方 若依官方针对不同开发需求提供了多个版本的框架,每个版本都有其独特的特点和适用场景: 前后端混合版本:RuoYi结合了SpringBoot和Bootstrap的前端开发框架,适合快速构建传统的Web应用程序,其…

java周测总结(3)

1、什么是I0流? 是一串流动的字符,从先进先出的方式要求信息的通道。 2、什么是序列化?什么是反序列化? 序例化是将对象的状态存储到特定的存储介质中的过程反序例化是将特定的有合者公质中数据重新构建对象的过程。 3、Java中线程在哪个包下…

第57期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

海思NNIE部署yolov5-shufflenet

1.简要说明 由于NNIE上transpose支持的顺序是固定的,shufflenet那种x=torch.transpose(x,1,2).contiguous() 的操作一般是不支持的。需要进行调整。 2.使用工程以及修改 使用的是开源工程:GitHub - Lufei-github/shufflev2-yolov5: shufflev2-yolov5:lighter, faster and ea…

vue根据文字长短展示跑马灯效果

介绍 为大家介绍一个我编写的vue组件 auto-marquee ,他可以根据要展示文本是否超出展示区域,来判断是否使用跑马灯效果,效果图如下所示 假设要展示区域的宽度为500px,当要展示文本的长度小于500px时,只会展示文本&…

maven 根据不同环境,走不同的实现(多种环境组合)

​ 原因: 线上程序同时支持人大金仓和mysql,且支持根据环境动态选择 java JCE 的实现方式前期已完成 springboot 从mysql 迁移人大金仓 -kingbase :https://blog.csdn.net/qq_26408545/article/details/137777602?spm1001.2014.3001.5502 …

[leetcode] n个骰子的点数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<double> statisticsProbability(int num) {vector<double> dp(6, 1.0 / 6.0);for (int i 2; i < num; i) {vector<double> tmp(5 * i 1, 0);for (int j 0; j < dp.size()…