面试-如何设计一个高并发 高可用的系统

【摘要】 回答这个问题可以分为以下 几 点 (但最好都要结合着自己的业务系统,讲述下自己系统中的应用):
系统拆分 Cache(缓存) MQ 数据库拆分(分库分表) 读写分离 HTML 页面静态化 CDN 加速

1系统拆分
将一个系统拆分为多个子系统,使用 Spring Cloud 或者 dubbo 来做。然后每个系统连一个数据库,这样本来就一个库,现在多个数据…

回答这个问题可以分为以下 几点 (但最好都要结合着自己的业务系统,讲述下自己系统中的应用):

  • 系统拆分

  • Cache(缓存)

  • MQ

  • 数据库拆分(分库分表)

  • 读写分离

  • HTML 页面静态化

  • CDN 加速

high-concurrency-system-design

1系统拆分

将一个系统拆分为多个子系统,使用 Spring Cloud 或者 dubbo 来做。然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,不也可以扛高并发么。

1.1 系统拆分成多个应用有以下优点:

针对可并发 高可用的优点:

可扩展

应对系统业务增长的方法通常采用横向(Scale out)或纵向(Scale up)的方向进行扩展。分布式系统中通常要采用Scale out的方式进行扩展。因为不同的功能会面对不同的负荷变化,因此采用微服务的系统相对单块系统具备更好的可扩展性。当在大促活动期间,我们可以通过增加实例个数来扛过活动期价瞬时流量

高可靠

微服务间独立部署,一个微服务的异常不会导致其它微服务同时异常。通过隔离、融断等技术可以避免极大的提升微服务的可靠性

技术异构

在一个大型系统中,不同的功能具有不同的特点,并且不同的团队可能具备不同的技术能力。因为微服务间松耦合,不同的微服务可以选择不同的技术栈进行开发。

同时,在应用新技术时,可以仅针对一个微服务进行快速改造,而不会影响系统中的其它微服务,有利于系统的演进。

比如在示例中,如果因为库存系统数据量变大,我们需要数据由当前的sqlite数据库修改为MySQL,可以仅修改Inventory Service,而不需要要求整个系统的数据库全部替换。

其他优点:

各服务职责单一,逻辑清晰,多个服务模块间可并行研发;

简化部署,单一模块的更新不会影响到其他服务

灵活组合,在微服务架构中,可以通过组合已有的微服务以达到功能重用的目的。

1.2 服务拆分缺点:

复杂度高:

微服务间通过REST、RPC等形式交互,需要考虑被调用方故障、过载、消息丢失等各种异常情况,分布式系统管理复杂,分布式链路跟踪问题难,分布式事务处理复杂

(分布式链路追踪问题,以dubbo为例,可以参考这篇博客基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪

运维复杂

在采用微服务架构时,系统由多个独立运行的微服务构成,需要一个设计良好的监控系统对各个微服务的运行状态进行监控。运维人员需要对系统有细致的了解才对够更好的运维系统。

2 缓存

这也是常见的一种优化方式,在数据库层之上加一层缓存,减少对数据库的访问压力。

大部分的高并发场景,都是读多写少,那你完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存不就得了。所以你可以考虑考虑你的项目里,那些承载主要请求的读场景,怎么用缓存来抗高并发

远端缓存:数据写入redis,毕竟人家 redis 轻轻松松单机几万的并发

高性能本地缓存框架: guava cache , Caffeine(Spring5放弃了使用多年的Guava而采用了Caffeine),所有读数据在缓存加载,提高系统响应速率

缓存雪崩、缓存穿透、缓存击穿问题

针对首页,如果不存在千人千面的状态,我们可以结合缓存采用下面这种方案提高系统响应速率:

3 消息队列(异步、削峰、解耦

引入了消息队列,那么可能下面一系列问题也就来到了额(重复消费、消息丢失、顺序消费,即 如何保证消息最终一致性

这篇文章 消息队列 讲述了消息队列的优缺点,以及 如何去解决 消息丢失、消费重复等问题

Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响     topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性 ms 级 微秒级,这是 RabbitMQ 的一大特点,延迟最低 ms 级 延迟在 ms 级以内
可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享