相关面试题

(1)高并发系统的设计原则有哪些?★★★★☆

(2)高可用系统的设计原则有哪些?★★★★☆

(3)如何测试并发量?★★★★☆

(4)QPS和TPS的区别是什么?★★★☆☆

(5)高并发和高吞吐分别指什么?★★★☆☆

(6)提高系统并发度有哪些方法?★★★☆☆

高并发系统的设计原则如下。

(1)服务拆分:根据系统维度、功能维度、读写维度、AOP维度、模块维度等对系统进行拆分。良好的系统模块拆分对系统的开发和维护都有好处。

(2)无状态设计:如果应用无状态,则可以进行多副本部署,随时扩缩容以灵活应对流量高峰。但是配置文件需要有状态,这样便可以跟踪历史配置文件的变化情况。

(3)服务治理:当系统变得复杂时,需要进行服务治理,比如自动注册和发现服务、服务分组、服务隔离、服务路由、服务限流、黑名单配置等。

(4)消息队列:用于实现服务解耦、异步处理、流量削峰、流量缓冲等。

(5)幂等设计:幂等设计在编程中的特性是其任意多次执行所产生的影响均与一次执行所产生的影响相同。当程序符合幂等设计的特性时,便可安全地使用错误重试。

(6)异步编程:可以提高系统的并发度,在可能的情况下尽量使用异步调用。具体实现有Future和Callback等。

(7)数据治理:对于数据层采用读写分离、分库分表、数据分层等技术实现数据层的高并发和数据的高可用性。

(8)缓存:主要用于提高数据的访问速度,具体包括如下几种。

◎ 浏览器缓存:例如对网站图片进行缓存来提高访问速度。

◎ App客户端缓存:例如将配置信息缓存到客户端。

◎ CDN缓存:具体做法是把资源推送到离用户最近的CDN节点。

◎ 接入层缓存:例如使用Nginx搭建一层接入层,在Nginx上进行缓存处理。

◎ 应用层缓存:例如在应用内使用Redis对常用数据进行缓存。

◎ 分布式缓存:当数据量太多以致单机存储不下时,用分片机制将缓存数据存储在多台服务器上。

(9)计算与存储分离:在计算与存储分离后计算层和存储层均可自由伸缩,以应对灵活的业务需求。

(10)弹性设计:在云上采用弹性设计思想,在高峰时弹出更多的资源以应对流量高峰,在低峰时缩减资源以降低成本。

(11)限流设计:互联网上用户的流量是不可预知的,为了保障系统的稳定性,需要根据系统的并发量进行合理的限流配置。

(12)超时重试:当调用错误时需要考虑多次重试以保障最终调用成功,但是可重试的业务需要符合幂等性要求。

(13)可扩展设计:良好的可扩展性为需求的增加和变更带来很大方便。

(14)可维护设计:系统要易于维护,比如一个长期不敢重启的系统,其维护性就不强。另外,合理的日志存储和分析手段也是可维护性设计需要考虑的一个方面。

(15)可监控性设计:可监控性设计一般从系统日志、监控指标、调用链三方面来实现。

◎ 系统日志记录了系统在运行过程中某一时刻的状态,通过对日志中错误日志的实时监控能及时发现系统运行过程中的问题。

◎ 监控指标分为流量监控指标(例如QPS)、系统资源监控指标(例如CPU、内存、磁盘使用率)、业务监控指标(例如日流水变化)等多个维度。通过监控指标不但能及时发现当前系统可能出现的问题,还能根据系统资源监控的历史指标来评估资源需求是否合理。

◎ 调用链指服务之间相互调用关系的展示,能帮助我们快速分析出某个功能的调用逻辑和依赖关系,从而快速分析和解决问题。

(16)告警系统:当系统发生故障(例如进程宕机、错误日志过多、流量异常等)时能及时告警并通知维护人员处理,可以是多级告警,比如邮件、微信、短信、电话等。

(17)状态机:可以通过状态轨迹方便地追溯问题,同时解决并发状态修改、状态变更有序、状态变更消息先到或后到等问题。

高可用系统的设计原则

高可用系统的设计原则如下。

(1)多副本部署:将服务以多副本形式部署在多台服务器上,当某台服务器出现故障时可以自动将请求切换到其他服务。

(2)服务降级:当高并发流量到来时可优先保障核心服务的可用性,非核心服务直接返回错误码或者调用Cache数据(Cache数据可能不是实时数据,所以数据的正确性可能存在问题)保证数据最终一致即可。同时可以将同步改异步,优先处理高优先级数据。服务降级可分为自动降级和人工降级,自动降级指系统根据调用失败的次数进行自动故障降级,人工降级指在系统发生故障后人工修改配置信息或者控制开关进行服务降级。

(3)限流:当高并发流量到来时可以用限流手段保障核心系统整体的稳定性,主要用于防御恶意请求。限流分接入层(例如网关)限流、应用(例如应用上的部分接口限流)限流等。

(4)负载均衡和分流:可以利用负载均衡技术将部分流量切到备用服务上缓解服务的压力。

(5)服务隔离:机房隔离(将服务跨机房部署)、资源隔离(例如每个项目都使用单独的数据库或者 Kafka 集群,以防止一个项目将基础服务打跨导致整个系统发生故障)、进程隔离(将服务拆分为多个微服务在不同的容器上运行)、线程隔离(不同的任务使用预分配好的线程池,防止某个任务把线程资源耗尽)。

(6)超时重试:当发生服务调用错误时,需要考虑多次重试以保障最终调用成功。

(7)可回滚:也就是版本化,具体包括代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。

Linux操作系统优化

要实现高并发,进行操作系统优化是前提条件。常见的系统优化方法如下。

(1)设置文件句柄:Linux中的每个进程默认打开的最大文件句柄数量都是1024,对于服务器进程来说该值太小,可以通过修改/etc/security/limits.conf来增加打开的最大文件句柄数量,一般建议将其设置为65 535。设置命令如下:

echo "* soft nofile 65535" >> /etc/security/limits.confecho "* hard nofile 65535" >> /etc/security/limits.conf

(2)设置虚拟内存:max_map_count定义了进程能拥有的最多内存区域,一般建议将其设置为102 400。设置命令如下:

sysctl -w vm.max_map_count=102400

(3)添加Swap:Swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中交互换出的操作系统不常用的Page数据,这样可以分配更多的内存做Page Cache。通过Swap可以提升系统的吞吐量和I/O性能。设置命令如下:

mkswap /dev/sdb1swapon /dev/sdb1

操作系统还有很多可以优化的参数,在具体使用过程中需要根据情况进行调整。除此之外,JVM参数调优也是决定应用程序性能的一个重要因素,具体参见3.9节。

内容摘自《Offer来了(第2版)》。这是一本超强Java面试宝典、面霸手册,超详尽的Java知识点速查,Java面试题库,帮你深入理解Java核心技术,对Java知识点查漏补缺,可作为工具书使用。

分类: 游戏攻略 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录