131. 面试中关于架构设计都需要了解哪些内容?

文章目录

  • 一、社区系统架构组件概览
    • 1. 系统拆分
    • 2. CDN、Nginx静态缓存、JVM本地缓存
    • 3. Redis缓存
    • 4. MQ
    • 5. 分库分表
    • 6. 读写分离
    • 7. ElasticSearch
  • 二、商城系统-亿级商品如何存储
  • 三、对账系统-分布式事务一致性
  • 四、统计系统-海量计数
  • 六、系统设计 - 微软
  • 1、需求收集
    • 2、顶层设计
    • 3、系统核心指标
    • 4、数据存储
  • 七、如何设计一个微博

一、社区系统架构组件概览

一个非常简易的系统架构大致如下:在这里插入图片描述

接下来就以上图为例,剖析每个组件的作用。

1. 系统拆分

通过DDD领域模型,对服务进行拆分,将一个系统拆分为多个子系统,做成微服务。微服务设计时要尽可能做到少扇出,多扇入,根据服务器的承载,进行客户端负载均衡,通过对核心服务的上游服务进行限流和降级改造。

一个服务的代码不要太多,1万行左右,两三万撑死了吧。

大部分的系统,是要进行多轮拆分的,第一次拆分,可能就是将以前的多个模块该拆分开来了,比如说将电商系统拆分成订单系统、商品系统、采购系统、仓储系统、用户系统等等吧。

但是后面可能每个系统又变得越来越复杂了,比如说采购系统里面又分成了供应商管理系统、采购单管理系统,订单系统又拆分成了购物车系统、价格系统、订单管理系统。

2. CDN、Nginx静态缓存、JVM本地缓存

利用Java的模板thymeleaf可以将页面和数据动态渲染好,然后通过Nginx直接返回。动态数据可以从redis中获取。其中redis里的数据由一个缓存服务来进行消费指定的变更服务。

商品数据,每条数据是10kb100条数据是1mb10万条数据是1g。常驻内存的是 200万条商品数据,占用内存是20g,仅仅不到总内存的50%。目前高峰期每秒就是 3500qps左右的请求量。

3. Redis缓存

Redis cluster10台机器,55从,5个节点对外提供读写服务,每个节点的读写高峰QPS可能可以达到每秒5万,5台机器最多是25万读写请求每秒。

注:一般一台Redis实例最大能承受的QPS在16万左右。

32G内存+ 8核CPU + 1T磁盘,但是分配给Redis进程的是10g内存,一般线上生产环境,Redis的内存尽量不要超过10g,超过10g可能会有问题。

因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,Redis从实例会自动变成主实例继续提供读写服务。

4. MQ

可以通过消息队列对微服务系统进行解耦,异步调用的更适合微服务的扩展。

同时可以应对秒杀活动中的高并发写请求,比如kafka在毫秒延迟基础上可以实现10w级吞吐量。

同时可以使用消息队列保证分布式系统最终一致性。

5. 分库分表

分库分表,可能到了最后数据库层面还是免不了抗高并发的要求,好吧,那么就 将一个数据库拆分为多个库,多个库来扛更高的并发;然后将一个表拆分为多个 表,每个表的数据量保持少一点,提高sql跑的性能。在通讯录、订单和商城商品模块超过千万级别都应及时考虑分表分库。一般单表保存的数据尽量不要超过4千万,否则查询性能可能受损,数据过大时,及时考虑分表处理,实际在需求初期就应该调研量级,考虑分表方案。

6. 读写分离

读写分离,这个就是说大部分时候数据库可能也是读多写少,没必要所有请求都 集中在一个库上吧,可以搞个主从架构,主库写入,从库读取,搞一个读写分离。读流量太多的时候,还可以加更多的从库。比如统计监控类的微服务通过读写分离,只需访问从库就可以完成统计,例如使用ES完成统计诉求,读从库即可。

7. ElasticSearch

Elasticsearch,简称eses是分布式的,分布式天然就可以支撑高并发,因为动不动就可以扩容加机器来扛更高的并发。那么一些比较简单的查询、统计类的操作,比如运营平台上的各地市的汇聚统计,还有一些全文搜索类的操作,比如通讯录和订单的查询,都很适合用es存储。

二、商城系统-亿级商品如何存储

基于Hash取模一致性Hash实现分库分表。

高并发读可以通过多级缓存应对。

大促销热key读的问题通过 redis集群+本地缓存+限流+key加随机值分布在多个实例中

高并发写的问题通过基于Hash取模一致性Hash实现分库分表均匀落盘。

业务分配不均导致的热key读写问题,可以根据业务场景进行range分片,将热点范围下的子key打散。

具体实现: 预先设定主键的生成规则,根据规则进行数据的分片路由,但这种方式会侵入商品各条线主数据的业务规则,更好的方式是基于分片元数据服务器(即每次访问分片前先询问分片元服务器再路由到实际分片),不过会带来复杂性,比如如何保证元数据服务器的一致性和可用性。

三、对账系统-分布式事务一致性

尽量避免分布式事务,单进程用数据库事务,跨进程用消息队列。

主流实现分布式系统事务一致性的方案:

  • 最终一致性:也就是基于MQ的可靠消息投递的机制,

  • 基于重试加确认的的最大努力通知方案。

理论上也可以使用(2PC两阶段提交、3PC三阶段提交、TCC短事务、SAGA长事务方案),但是这些方案工业上落地代价很大,不适合互联网的业界场景。针对金融支付等需要强一致性的场景可以通过前两种方案实现。
在这里插入图片描述

本地数据库事务原理:undo log(原子性) + redo log(持久性) + 数据库锁(原子性&隔离性) + MVCC(隔离性)

分布式事务原理:全局事务协调器(原子性) + 全局锁(隔离性) + DB本地事务(原子性、持久性)

MQ方式实现一致性应该保证以下两点

  • 要求下游MQ消费方一定能成功消费消息。否则转人工介入处理。
  • 千万记得实现幂等性。

四、统计系统-海量计数

中小规模的计数服务(万级)

中小规模量级,最常见的计数方案是采用缓存+DB的存储方案。当计数变更时,先变更计数DB,计数加 1,然后再变更计数缓存,修改计数存储的MemcachedRedis。这种方案比较通用且成熟,但在高并发访问场景,支持不够友好。

在互联网社交系统中,有些业务的计数变更特别频繁,比如微博feed的阅读数,计数的变更次数和访问次数相当,每秒十万到百万级以上的更新量,如果用DB存储,会给DB带来巨大的压力,DB就会成为整个计数服务的瓶颈所在。即便采用聚合延迟更新DB的方案,由于总量特别大,同时请求均衡分散在大量不同的业务端,巨大的写压力仍然是DB的不可承受之重。

大型互联网场景(百万级)
百万及以上量级,建议直接把计数全部存储在Redis中,通过 hash 分拆的方式,可以大幅提升计数服务在Redis集群的写性能,通过主从复制,在master后挂载多个从库,利用读写分离,可以大幅提升计数服务在Redis集群的读性能。而且Redis有持久化机制,不会丢数据。

但也不是万无一失的,要以下方面要考虑。

一方面Redis作为通用型存储来存储计数,内存存储效率低。以存储一个keylong(8字节)idvalue4字节的计数为例,Redis至少需要65个字节左右(以为要记录很多其他元信息),不同版本略有差异。但这个计数理论只需要占用12个字节即可。内存有效负荷只有12/65=18.5%。如果再考虑一个longid需要存4个不同类型的4字节计数,内存有效负荷只有(8+16)/(65*4)= 9.2%

另一方面,Redis所有数据均存在内存,单存储历史千亿级记录,单份数据拷贝需要10T以上,要考虑核心业务上13从,需要40T以上的内存,再考虑多IDC部署,轻松占用上百T内存。就按单机100G内存来算,计数服务就要占用上千台大内存服务器。存储成本太高。

微博、微信、抖音(亿级)

亿级别数据,应该考虑通过以下方式存储

  • 定制数据结构,共享key 紧凑存储,提升计数有效负荷率;
  • 超过阈值后数据保存到SSD硬盘,内存里存索引;
  • keySSD硬盘中读取后,放入到LRU队列中;
  • 自定义主从复制的方式,海量冷数据异步多线程并发复制;

六、系统设计 - 微软

1、需求收集

  • 确认使用的对象
    • ToC:高并发
    • ToB:高可用
  • 系统的服务场景
    • 即时通信:低延迟
    • 游戏:高性能
    • 购物:秒杀-一致性
  • 用户量级
    • 万级:双机
    • 百万:集群
    • 亿级:弹性分布式、容器化编排架构
    • 百万读:3主6从,每个节点的读写高峰QPS可能可以达到每秒5万,可以实现15万,30万读性能
    • 亿级读: 通过CDN、静态缓存、JVM缓存等多级缓存来提高读并发
    • 百万写: 通过消息队列削峰填谷,通过hash分拆,水平扩展分布式缓存
    • 亿级写: redis可以定制数据结构、SSD+内存LRU、冷数据异步多线程复制
    • 持久化: Mysql承受量约为 1KQPS,读写分离提升读并发,分库分表提升写并发

2、顶层设计

核心功能包括什么:

  • 写功能:发送微博

  • 读功能:热点资讯

  • 交互:点赞、关注

3、系统核心指标

  • 系统性能和延迟

  • 边缘计算 | 动静分离 | 缓存 | 多线程 |

  • 可扩展性和吞吐量

  • 负载均衡 | 水平扩展 | 垂直扩展 | 异步 | 批处理 | 读写分离

  • 可用性和一致性

  • 主从复制 | 哨兵模式 | 集群 | 分布式事务

4、数据存储

  • 键值存储 : Redis ( 热点资讯 )

  • 文档存储 : MongoDB ( 微博文档分类)

  • 分词倒排:Elasticsearch(搜索)

  • 列型存储:HbaseBigTable(大数据)

  • 图形存储:Neo4j (社交及推荐)

  • 多媒体:FastDfs(图文视频微博)

七、如何设计一个微博

实现哪些功能:
筛选出核心功能(Post a Tweet,Timeline,News Feed,Follow/Unfollow a user,Register/Login)

承担多大QPS:

  • QPS = 100,那么用我的笔记本作Web服务器就好了
  • QPS = 1K,一台好点的Web服务器也能应付,需要考虑单点故障;
  • QPS = 1m,则需要建设一个1000台Web服务器的集群,考虑动态扩容、负载分担、故障转移
  • 一台SQL Database (Mysql)承受量约为1K的QPS;
  • 一台NoSQL Database (Redis) 约承受量是20k的QPS;
  • 一台NoSQL Database (Memcache) 约承受量是200k的QPS;

微服务战略拆分
在这里插入图片描述

针对不同服务选择不同存储
在这里插入图片描述

设计数据表的结构
在这里插入图片描述

基本差不多就形成了一个解决方案,但是并不是完美的,仍然需要小步快跑的不断的针对消息队列、缓存、分布式事务、分表分库、大数据、监控、可伸缩方面进行优化。

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

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

相关文章

【Django】从零开始学Django(持续更新中)

PyCharm的版本必须为专业版,社区版不具备Web开发功能的。 一. Django建站基础 Django采用MTV的框架模式,即模型(Model)、模板(Template)和视图(Views),三者之间各自负责不同的职责。 ●模型:数据存取层,处理与数据相关…

信号:MSK调制和GMSK调制

目录 一、MSK信号 1. MSK信号的第k个码元 2.MSK信号的频率间隔 3.MSK信号的相位连续性 3.1 相位路径 3.2初始相位ψk 4.MSK信号的产生 原理框图 5.MSK信号的频谱图 二、高斯最小频移键控(GMSK) 1.频率响应 2.GMSK调制产生方式 2.1 高斯滤波器法 2.2 正交调制器法…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP?什么是原生IP? 1、海外私人IP: 海外私人IP是由专门的服务提供商提供的IP地址,这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP广泛应用与跨境电商中&#x…

【Qt】修改QToolButton图标颜色

1. 目的 修改QToolButton的图标颜色,单一颜色,效果类似于Qt Creator左边选项卡。 2. 代码 QIcon MainWindow::setIconColor(QIcon icon, QColor color) {QPixmap pixmap icon.pixmap(QSize(64,64));QPainter painter(&pixmap);painter.setCompo…

汇编:函数以及函数参数传递

汇编语言中的函数(或过程)是指一段可以被调用和执行的代码块;它们用于组织和重用代码,并使程序结构更加清晰;由于汇编语言没有高层次语言的语法糖,编写和调用函数涉及直接的堆栈操作和寄存器管理&#xff1…

多项式重构的平滑和法线估计-------PCL

多项式重构的平滑和法线估计 /// <summary> /// 多项式重构的平滑和法线估计 /// </summary> /// <param name"cloud"></param> /// <returns>输出一个包含平滑后的点云数据以及相应法线信息的数据结构</returns> pcl::PointCl…

28v电源 28V电源系统 28v航空电源系统概述

28V电源是指一种工作电压为28V的直流电源系统&#xff0c;主要用于航空电子、航天、J事和高端工业应用中。它通常用于为复杂的电子设备和系统供电&#xff0c;如飞机上的导航、通信、控制面板、计算机系统等。这些设备需要稳定的电压输入&#xff0c;而28V电压既能够保证电力供…

第12周作业--HLS入门

目录 一、HLS入门 二、HLS入门程序编程 创建项目 1、点击Vivado HLS 中的Create New Project 2、设置项目名 3、加入文件 4、仿真 3、综合 一、HLS入门 1. HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系? HLS&#xff08;High-Level Synthesis&#xff0c…

(Askchat.ai、360智脑、鱼聪明、天工AI、DeepSeek)

目录 1、Askchat.ai - 梦想为蓝图&#xff0c;ChatGPT为笔。 2、360智脑 — 以人为本&#xff0c;安全可信 3、鱼聪明AI - 做您强大的AI助手 (yucongming.com) 4、天工AI-搜索、对话、写作、文档分析、画画、做PPT的全能AI助手 (tiangong.cn) 5、DeepSeek | 深度求索 1、Askch…

基于STM32实现智能风扇控制系统

目录 文章主题环境准备智能风扇控制系统基础代码示例&#xff1a;实现智能风扇控制系统 PWM控制风扇速度温度传感器数据读取串口通信控制应用场景&#xff1a;智能家居与环境调节问题解决方案与优化收尾与总结 1. 文章主题与命名 文章主题 本教程将详细介绍如何在STM32嵌入式…

Docker Desktop安装和如何在WSL2中使用Docker

最近在使用WSL的过程中&#xff0c;想使用docker遇到了一些问题&#xff0c;在WSL中安装Linux版本的docker&#xff0c;启动镜像之后不能从Windows机器的端口映射出来&#xff0c;查了一圈之后&#xff0c;发现应该使用Docker Desktop软件&#xff0c;下面是安装和使用的方式 …

[源码+搭建教程]西游伏妖篇手游_GM_单机+和朋友玩

为了学习和研究软件内含的设计思想和原理&#xff0c;本人花心血和汗水带来了搭建教程&#xff01;&#xff01;&#xff01; 教程不适于服架设&#xff0c;严禁服架设&#xff01;&#xff01;&#xff01;请牢记&#xff01;&#xff01;&#xff01; 教程仅限学习使用&…

深入解析自注意力机制(Self-Attention):深度学习中的关键创新

Self-Attention 深入解析自注意力机制&#xff08;Self-Attention&#xff09;&#xff1a;深度学习中的关键创新自注意力机制的起源自注意力机制的工作原理关键组件公式表达 自注意力机制的应用结论 深入解析自注意力机制&#xff08;Self-Attention&#xff09;&#xff1a;深…

springboot集成达梦数据库8

springboot集成达梦数据库8 官方文档&#xff1a;[https://eco.dameng.com/document/dm/zh-cn/start/java-development.html](https://eco.dameng.com/document/dm/zh-cn/start/java-development.html) 引入maven依赖 <!--添加数据库驱动安装包--> <dependency> …

Threejs路径规划_基于A*算法案例完整版

上节利用了A*实现了基础的路径规划&#xff0c;这节把整个功能完善好&#xff0c;A*算法一方面是基于当前点找到可以到达的点&#xff0c;计算从出发点到此点&#xff0c;以及此点到目的地的总成本&#xff0c;比较出最小的那个&#xff0c;再用最小成本的点继续找到它可以到达…

明天(周六)下午!武汉Linux爱好者线下沙龙,我们在华中科技大学等你!

2024 年 5月 25 日&#xff08;周六&#xff09;下午&#xff0c;我们将在「武汉市洪山区」 珞喻路 1037 号华中科技大学南五楼 613 室举办武汉 Linux 爱好者线下沙龙&#xff08;WHLUG&#xff09;&#xff0c;欢迎广大 Linux 爱好者来到现场&#xff0c;与我们一同交流技术&a…

Kubernetes——资源调度与Pod探针

目录 前言 一、资源调度策略 1.默认调度器&#xff08;Default Scheduler&#xff09; 2.自定义调度器&#xff08;Custom Scheduler&#xff09; 3.亲和性与反亲和性&#xff08;Affinity and Anti-Affinity&#xff09; 4.污点与容忍&#xff08;Taints and Toleration…

Window GDI+ API有BUG?GetBounds测不准?

文章目录 GraphicsPath的GetBounds测不准&#xff1f;方法一&#xff1a;GetBounds ()实战 方法二&#xff1a;GetBounds(Matrix)实战 GraphicsPath的GetBounds测不准?实战 .NET 版本的问题&#xff1f;C也一样&#xff0c;不是.NET的问题怀疑人生MiterLimit惹得祸完美结果结束…

MyBatis-Plus介绍及Spring Boot 3集成指南

我们每个Java开发者都在使用springbootmybatis开发时&#xff0c;我们经常发现自己需要为每张数据库表单独编写XML文件&#xff0c;并且为每个表都需要编写一套增删改查的方法&#xff0c;较为繁琐。为了解决这一问题&#xff0c;MyBatis-Plus应运而生。在本文中&#xff0c;我…

第七节:带你全面理解vue3: 其他响应式进阶API

前言: 针对vue3官网中, 响应式:进阶API 中, 我们在上一章中给大家讲解了shallowRef, shallowReactive, shallowReadonly几个API的使用. 本章主要对剩下的API 进行讲解, 我们先看一下官网中进阶API 都有那些 对于剩下这些API, 你需要了解他们创建目的, 是为了解决之前的API存在…