1000个并发线程,10台机器,每台机器4核,设计线程池大小 (3)

简介: 1000个并发线程,10台机器,每台机器4核,设计线程池大小 (3)

那么处理这个 100 个并发请求也是绰绰有余的。


同样,如果是每秒 100 个并发请求源源不断的过来,那么很快就会抛出线程池满的异常:


image.png


解决套路其实是和 Tomcat 的情况差不多的,调参数,改系统,加异步。


这个情况下的并发,大多数系统还是抗住的。


面试官还可以接着追问:如果这时由于搞促销活动,系统流量翻了好倍,那你说这种情况下最先出现性能瓶颈的地方是什么?


最先出问题的地方肯定是数据库嘛,对吧。


那么怎么办?


分散压力。分库分表、读写分离这些东西往上套就完事了。


然后在系统入口的地方削峰填谷,引入缓存,如果可以,把绝大部分流量拦截在入口处。


对于拦不住的大批流量,关键服务节点还需要支持服务熔断、服务降级。


实在不行,加钱,堆机器。没有问题是不能通过堆机器解决的,如果有,那么就是你堆的机器不够多。



image.png


面试反正也就是这样的套路。看似一个发散性的题目,其实都是有套路可寻的。


好了,第一个角度我觉得我能想到的就是这么多了。


首先正面回答了面试官线程池设计的问题。


然后分情况聊了一下如果我们项目中没有用线程池,能不能直接抗住这 1000 的并发。


最后简单讲了一下突发流量的情况。


接下来,我们聊聊负载均衡。


负载均衡策略


我觉得这个考点虽然稍微隐藏了一下,但还是很容易就挖掘到的。


毕竟题目中已经说了:10 台机器。


而且我们也假设了平均 1 台处理 100 个情况。


这个假设的背后其实就是一个负载均衡策略:轮询负载均衡。


如果负载均衡策略不是轮询的话,那么我们前面的线程池队列长度设计也是有可能不成立的。


还是前面的场景,如果我们是运行在 Tomcat 容器中,假设前面是 nginx,那么 nginx 的负载均衡策略有如下几种:


  1. (加权)轮询负载均衡


  1. 随机负载均衡


  1. 最少连接数负载均衡


  1. 最小响应时间负载均衡


  1. ip_hash负载均衡


  1. url_hash负载均衡


如果是 RPC 服务,以 Dubbo 为例,有下面几种负载均衡策略:


  1. (加权)轮询负载均衡


  1. 随机负载均衡


  1. 最少活跃数负载均衡


  1. 最小响应时间负载均衡


  1. 一致性哈希负载均衡


image.png


哦,对了。记得之前还有一个小伙伴问我,在 Dubbo + zookeeper 的场景下,负载均衡是 Dubbo 做的还是 zk 做的?


肯定是 Dubbo 啊,朋友。源码都写在 Dubbo 里面的,zk 只是一个注册中心,关心的是自己管理着几个服务,和这几个服务的上下线。


你要用的时候,我把所有能用的都给你,至于你到底要用那个服务,也就是所谓的负载均衡策略,这不是 zk 关心的事情。


不扯远了,说回来。


假设我们用的是随机负载均衡,我们就不能保证每台机器各自承担 100 个请求了。


这时候我们前面给出的线程池设置就是不合理的。


常见的负载均衡策略对应的优缺点、适用场景可以看这个表格:


image.png


关于负载均衡策略,我的《吐血输出:2万字长文带你细细盘点五种负载均衡策略》这篇文章,写了 2 万多字,算是写的很清楚了,这里就不赘述了。


说起负载均衡,我还想起了之前阿里举办的一个程序设计大赛。赛题是《自适应负载均衡的设计实现》。


赛题的背景是这样的:


负载均衡是大规模计算机系统中的一个基础问题。灵活的负载均衡算法可以将请求合理地分配到负载较少的服务器上。


理想状态下,一个负载均衡算法应该能够最小化服务响应时间(RTT),使系统吞吐量最高,保持高性能服务能力。


自适应负载均衡是指无论处在空闲、稳定还是繁忙状态,负载均衡算法都会自动评估系统的服务能力,更好的进行流量分配,使整个系统始终保持较好的性能,不产生饥饿或者过载、宕机。


具体题目和获奖团队答辩可以看这里:


题目:https://tianchi.aliyun.com/competition/entrance/231714/information?spm=a2c22.12849246.1359729.1.6b0d372cO8oYGK
答辩:https://tianchi.aliyun.com/course/video?spm=5176.12586971.1001.1.32de8188ivjLZj&liveId=41090

推荐大家有兴趣的去看一下,还是很有意思的,可以学到很多的东西。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2天前
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
21 2
|
1天前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
1天前
|
存储 调度
进程与线程(概念、并行、并发)
进程与线程(概念、并行、并发)
|
2天前
|
存储 Java 调度
Java多线程基础-11:工厂模式及代码案例之线程池(二)
这篇内容介绍了Java多线程基础,特别是线程池中的定时器和拒绝策略。
15 0
|
3天前
|
分布式计算 Java Hadoop
NameNode 处理线程配置(心跳并发)
NameNode线程池处理客户端和数据节点请求,如读写文件及心跳、块报告。通过调整`dfs.namenode.handler.count`(默认10,示例设为21)在`hdfs-site.xml`中可控制并发处理能力。线程数过多或过少都可能影响性能,需平衡资源使用并进行基准测试以确定最佳值。合理线程数可通过公式`int(math.log(N) * 20)`计算,N为服务器数量。例如,3台服务器的计算结果为21。
|
4天前
|
安全 Java 开发者
探索Java中的多线程编程与并发控制
多线程编程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,从而显著提高程序的整体性能。然而,多线程编程也带来了诸如数据不一致、死锁等并发问题。本文将深入探讨Java中的多线程编程技术,包括线程的创建、同步与通信,并介绍几种常用的并发控制策略,旨在帮助读者更好地理解并发编程的复杂性和挑战,并学会如何编写高效、安全的并发程序。
|
5天前
|
安全 Java 容器
线程安全问题、同步代码块、同步方法、线程池详解
线程安全问题、同步代码块、同步方法、线程池详解
16 0
|
6天前
|
缓存 安全 Java
JAVA多线程编程与并发控制
```markdown Java多线程编程与并发控制关键点:1) 通过Thread或Runnable创建线程,管理线程状态;2) 使用synchronized关键字和ReentrantLock实现线程同步,防止数据竞争;3) 利用线程池(如Executors)优化资源管理,提高系统效率。并发控制需注意线程安全,避免死锁,确保程序正确稳定。 ```
|
1天前
|
缓存 Java 编译器
Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字(二)
加锁其实是一个比较低效的操作,因为加锁就可能涉及到阻塞等待。
12 1
|
1天前
|
安全 Java 编译器
Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字(一)
下面就是一个线程不安全的例子。该代码中创建了一个counter变量,同时分别创建了两个线程t1和t2,让这两个线程针对同一个counter令其自增5w次。
13 0