面试题:如何设计一个分布式系统?

分布式系统设计


前言

此文章内容仅供参考,起因是我面试一家公司被问到了

如果让你设计一个分布式系统,你会如何设计?

这个问题问的我哑口无言,不知所云,讲不出话
所以就,,就总结了一些,提供给那些也被这么面试过的人看看
文章没写啥实际的解决方案(实际的解决方案我是懂的,就是写出来的话还是需要时间构思一下),先就是提供一套说词,如果被问到,应该从什么方面讲,如何才能讲的好


一、什么是分布式系统

首先谈一下什么是分布式系统?分布式系统是由许多计算机节点组成,为了完成单个计算机无法完成的任务,通过网络通信,共同协调,组成一个复杂的系统,利用更多的计算机节点,处理更大的数据量和更高的并发量。(面试的时候可以不用扯太多这方面的,不是重点,大家都懂

二、CAP理论

分布式系统的设计,离不开一个理论,CAP理论。C是一致性,保证在某个时间读取到的数据是一致的,比如事务的一致性,缓存的一致性,多副本的一致性等。A是可用性,就被叫做可达性,在高并发或者系统性能不足的情况下,出现超时等情况,导致客户端的请求不可达,系统无法提供可靠的服务。P是分区容错性,系统变成分布式之后,就有了多个节点,节点之间的需要进行网络通信,就可能存在网络超时,网络中断等情况。在分布式的环境下,P是一个必须要存在的条件,一般是CP或者AP,之间权衡,CP保证数据的强一致性,但是牺牲了性能,比如zookeeper,AP保证系统高可用,但牺牲了一定的一致性,如数据库主从复制,kafka副本机制。

基于CAP理论,我们可以知道分布式系统的设计,存在以下几个问题

  1. 高并发场景下的性能问题
  2. 高可靠问题,如何尽量减少故障发生的次数
  3. 高可用问题,如何保证发生了故障后能尽快的恢复
  4. 分布式事物问题,如何保证缓存数据库,两个数据库,两个服务,两个文件等数据的一致性
  5. 多副本一致性问题,kafka副本机制,zookeeper leader节点与flower节点的数据同步等等
  6. 跨域容灾,异地多活

而我们做分布式系统,为什么会引发这些问题呢,还得从我们引入的模块与中间件说起(引出一些问题,说明你有去做思考

三、中间件

介绍一下我们系统中所使用到的一些组件(每个人因为项目不同这方面都不同,可以针对自己使用的组件介绍一下,最好做一下技术选型的对比,比如消息队列为什么你们最终选了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

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值