面试题:如何设计一个分布式系统?
分布式系统设计
文章目录
- 分布式系统设计
- 前言
- 一、什么是分布式系统
- 二、CAP理论
- 三、中间件
- 四、常见分布式问题解决方案及举例(真正的解决方案改天有空写写吧)
- 总结
前言
此文章内容仅供参考,起因是我面试一家公司被问到了
如果让你设计一个分布式系统,你会如何设计?
这个问题问的我哑口无言,不知所云,讲不出话
所以就,,就总结了一些,提供给那些也被这么面试过的人看看
文章没写啥实际的解决方案(实际的解决方案我是懂的,就是写出来的话还是需要时间构思一下
),先就是提供一套说词,如果被问到,应该从什么方面讲,如何才能讲的好
一、什么是分布式系统
首先谈一下什么是分布式系统?分布式系统是由许多计算机节点组成,为了完成单个计算机无法完成的任务,通过网络通信,共同协调,组成一个复杂的系统,利用更多的计算机节点,处理更大的数据量和更高的并发量。(面试的时候可以不用扯太多这方面的,不是重点,大家都懂
)
二、CAP理论
分布式系统的设计,离不开一个理论,CAP理论。C是一致性,保证在某个时间读取到的数据是一致的,比如事务的一致性,缓存的一致性,多副本的一致性等。A是可用性,就被叫做可达性,在高并发或者系统性能不足的情况下,出现超时等情况,导致客户端的请求不可达,系统无法提供可靠的服务。P是分区容错性,系统变成分布式之后,就有了多个节点,节点之间的需要进行网络通信,就可能存在网络超时,网络中断等情况。在分布式的环境下,P是一个必须要存在的条件,一般是CP或者AP,之间权衡,CP保证数据的强一致性,但是牺牲了性能,比如zookeeper,AP保证系统高可用,但牺牲了一定的一致性,如数据库主从复制,kafka副本机制。
基于CAP理论,我们可以知道分布式系统的设计,存在以下几个问题
- 高并发场景下的性能问题
- 高可靠问题,如何尽量减少故障发生的次数
- 高可用问题,如何保证发生了故障后能尽快的恢复
- 分布式事物问题,如何保证缓存数据库,两个数据库,两个服务,两个文件等数据的一致性
- 多副本一致性问题,kafka副本机制,zookeeper leader节点与flower节点的数据同步等等
- 跨域容灾,异地多活
而我们做分布式系统,为什么会引发这些问题呢,还得从我们引入的模块与中间件说起(引出一些问题,说明你有去做思考
)
三、中间件
介绍一下我们系统中所使用到的一些组件(每个人因为项目不同这方面都不同,可以针对自己使用的组件介绍一下,最好做一下技术选型的对比,比如消息队列为什么你们最终选了kafka,注册中心为什么是nacos)(这里引出中间件,就是因为加了这么些中间件,才引发的那些问题,最后才有解决问题的说法,然后也可以谈谈中间件怎么引入,总不能一直说怎么解决那些问题吧,很枯燥,面试官可能也没兴趣
) :
- 底层架构:以springcloud为基础架构,用dubbo做统一数据中台rpc调用层(一般是给flink等计算的中间件调用的)
- 负载均衡:nginx,高性能,高并发的web服务器,提供反向代理,静态资源缓存,访问控制,限流等功能
- 服务网关:用来做请求的过滤和校验,限流以及监控功能。zuul或者gateway,gateway框架较新,支持websocket,支持集成hystrix,sentinel做负载均衡,基于异步非阻塞io,底层netty写的,性能更好,zuul是老式框架才会用的,现在我们系统中基本已经废弃
- 注册中心:用来做服务注册与发现,常见的有zookeeper,支持强一致性,eureka,基于高可用,以及nacos可以在两种类型中自由切换,并且支持分布式的配置中心功能
- 服务熔断,限流,降级组件,hystrix和sentinel,sentinel界面更加美观,轻松配置,现在我们系统中集成的是这个
- 分布式链路追踪:skywalking(这个分布式链路追踪被问过好多回)
- 消息队列:异步解耦削峰,同时带来了消息一致性,持久性,幂等性等问题,保证吞吐量可以使用kafka或者rocketmq,保证低延迟首选rabbitmq,我们系统中大部分做大数据处理的,所以采用了kafka
- 分布式缓存:缓存已经不局限于单节点服务器中,开始用一个专门的中间件来做了,一般是redis
- 数据库:mysql,大数据量的情况下需要进行分库分表,集群部署,也带来了分布式事物,多副本一致性问题
- 搜索引擎:针对大量文档,做到搜索的毫秒级响应,自带去中心化集群,简单容易上手,elasticsearch肯定是首选的,以前的使用的solr集群部署,字段添加删除依赖zookeeper,对开发及其不友好,已废弃
- 日志:elk,flume等日志解析架构,日志埋点
- 大数据平台:针对单表超过亿级或者数据量达到TB级的,我们都选择用大数据框架进行存储,由原先的CDH平台架构,升级到现在的kettle,flink,doris数仓架构,借用分布式调度工具,数据同步工具,实现对数据的离线或者实时分析
- 容器化部署:docker,k8s
四、常见分布式问题解决方案及举例(真正的解决方案改天有空写写吧)
正是因为引入了那些中间件,所以出现了很多分布式的问题,下面谈谈一些分布式问题的具体解决方案和举例吧(引出解决问题,我这里就大致列了一些问题,没有谈具体的解决方案,大家可以自己去查阅资料或者我有空会写一写或者看看我文章末尾发的git,里面都有,最近忙于面试,没啥时间
):
- 分布式事务问题解决方案:两阶段,三阶段,tcc,消息队列(事务消息,本地消息列表),同步双写+异步对账,阿里云seata
- 分布式线程安全问题:数据库CAS更新,redis或者zookeeper的分布式锁
- 缓存与数据库一致性问题:延迟双删,CDC变更数据捕获机制
- 多副本一致性问题:mysql半同步复制数据不一致问题,kafka数据丢失问题,paxos,raft,zab算法
- 单点故障问题:故障探测,故障转移,master选举,redis sentinel集群举例
- 集群脑裂问题:mysql HMA架构,master节点隔离的方式解决集群脑裂方式,es解决集群脑裂
- 高可用依赖的连环套问题:redis sentinel集群,互相探测心跳
- 侧重于并发读系统与侧重于并发写系统的分析
- 跨域容灾,异地多活怎么做
总结
只是提供一个说法和思路,真正面试的时候,还是要自由发挥,这不是八股文,自己背是肯定背不下来,一问就倒,还是要深入去理解一些东西,看看书吧,推荐一本我看的,现在这个年代,要是不会分布式,真的搞不了。
架构设计2.0:大型分布式系统架构方法论与实践
还有分享最近自己准备面试然后准备的八股文以及答案,我都是写java代码里面,有兴趣自己clone看看
https://gitee.com/you-jianming/code.git
面试题:如何设计一个分布式系统?相关推荐
- oom 如何避免 高并发_【面试题】如何设计一个高并发系统?
面试题 如何设计一个高并发系统? 原文链接:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/high- ...
- mysql每秒支持多少并发_如何设计一个高并发系统?
面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确 ...
- 高并发面试 - 如何设计一个高并发系统?
高并发面试 - 如何设计一个高并发系统? 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里 ...
- 如何设计一个高并发系统架构
1,一般一个高并发系统的架构组成如下图所示: 2,面试题 如何设计一个高并发系统? 3.面试官心里分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘 ...
- 面试题:如何设计一个高并发系统?
面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确实有真才实学,在互联网公司里干过高 ...
- JAVA面试题:你怎么设计一个消息队列?
1 面试题 写一个消息队列,你如何进行架构设计,说一下你的思路! 2 考点分析 一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个mq的架构原理 ...
- 设计一个分步式登录系统_分布式系统:何时构建它们以及如何扩展。 分步指南。
设计一个分步式登录系统 It always strikes me how many junior developers are suffering from impostor syndrome whe ...
- 面试题之如何用Java设计一个自动售货机
如何用Java设计一个自动售货机程序是一个非常好的Java面试题.大多数情况会在面试比较senior的Java开发者的时候出现.在一个典型的代码面试中,你需要在一定的时间内根据对应的条件完成相关的代码 ...
- 软件测试面试题:请设计一个关于ATM自动取款机的测试用例?
请设计一个关于ATM自动取款机的测试用例? 1)功能a)ATM所识别卡的类型:b)密码验证(身份登陆.是否为掩码.输入错误密码时是否提示,连续三次错误吞卡等):c)取款功能:i.金额多少的限制,单次最 ...
最新文章
- gitlab run成功 但无法访问_gitlab 部署 管理
- 二维数组和二级指针关系浅析
- UVa11464 - Even Parity(递推法)
- Scala 中下划线的用法
- 什么是故事板?(故事图、Storyboard)(软件显示效果的视觉草图,用于视频创作和广告设计,表达作者的创意)
- python 判断等于0_Python 条件语句介绍
- c treelist绑定mysql_TreeList 绑数据
- excel删除行闪退_excel2010闪退的处理方法
- java中文乱码decode_Java WEB开发中的中文乱码问题解决
- Linux之DHCP服务及配置
- DB2 数据库软件下载
- 早年的一篇关于80286保护模式的文章
- matlab指南针的例子,matlab画指北针
- 日常部署之OA办公系统源码OA协同办公源码包含CRM客户管理系统+内部聊天工具+自适应手机(含php源码)
- 域服务器性能要求,ad域服务器配置要求
- puppet的使用:ERB模板介绍
- 密度测量:1.密度测量的基础知识
- mysql users 命令大全_mysql 命令大全
- Codeforces Raif Round 1 (Div. 1 + Div. 2) E. Carrots for Rabbits(贪心)
- 华中科技大学非全日制计算机上课,2019年华中科技大学在职研究生是怎么上课的...