大家好,我是大圣,好久不见。
欢迎来到这个充满挑战与奇迹的技术世界。在这篇文章中,我们要聊聊那些听起来有点“高大上”,但其实与我们日常生活紧密相连的话题。
并发与并行,高并发是什么鬼,多线程和异步编程又是怎么一回事,什么叫做并发写、并发读,为啥我们还需要锁,MVCC又是个啥玩意儿,以及Flink在写入HDFS和Hudi时遇到的并发问题。
这些名词听起来是不是有点绕口?别担心,我会用最通俗的语言,把这些难懂的概念给讲清楚。
并发和并行
“并发”与“并行”是计算中常见的两个概念,它们描述了多任务执行的两种不同方式,但常常被人们混淆。大家先看下面这两个例子感受一下并发和并行。
想象一下,你正在家里准备晚餐,你需要炒菜、煮饭和洗水果。这里,你就像一个“处理器”,而炒菜、煮饭和洗水果就是需要完成的“任务”。
并发(Concurrency)
这就像你在厨房里,先把饭放进电饭煲煮着,然后开始炒菜。在菜炒的时候,你发现饭煮好了,这时你暂停炒菜,去关掉电饭煲,然后继续炒菜。在炒菜的过程中,你又暂停,去洗水果。
最终,三个任务都完成了。这个过程中,虽然任何时候你只做一件事,但由于任务之间的切换,三个任务看起来是“同时”进行的,这就是并发。
并行(Parallelism)
如果你家里来了朋友帮忙,你在炒菜,你的朋友在洗水果,同时电饭煲在煮饭。这时,三个任务确实是在同一时刻进行的,这就是并行。
通过这个例子,我们可以看出,并发是指单个处理器处理多个任务的能力,它依靠任务切换来让任务看起来似乎是同时进行的。而并行则是指多个处理器(或者多核)同时处理多个任务,实现了真正意义上的同时进行。
小结
在这里咱们先对并发和并行有一个最基本的认识,接下来讲的所有问题都会基于并发和并行这两个概念,等我把剩下的问题说完,相信大家对并发和并行会有更深刻的认识。
那如果我们的处理器是多核的话,这个时候还会有并发吗?我们带着这个问题继续看下面的内容。
什么是高并发
"高并发"是一个计算机科学和网络技术领域的术语,指的是在一个时间段内,系统能够处理的并发任务的数量很大。在许多情况下,这是指系统能够同时服务于多个用户或连接。它是一个重要的指标,因为它可以衡量系统的负载能力和稳定性。
看到上面这样的专业解释,我想大家可能觉得这说的什么阿,大家别着急,我用下面一个例子给大家解释一下上面这段话是什么意思。
想象一下一个非常受欢迎的快餐店。在普通的中午时段,这个快餐店可能有10个点餐窗口,并且每个窗口都有顾客在点餐。如果每个点餐窗口都能够迅速地为顾客服务,那么排队的人就能够流畅地前进,每个顾客都能在较短的时间内得到他们的食物。
现在,假设在某一天,这家快餐店推出了一个新的促销活动,吸引了大量的顾客。突然,店里涌入了数倍于平常的顾客,每个点餐窗口前都排起了长队。这就是一个高并发的情况。
如果这家快餐店事先做了充分的准备,例如增加了点餐窗口的数量、提高了制作食物的速度或者引入了自助点餐机,那么即使面对这么多的顾客,它仍然能够快速地为每个人服务。这样的快餐店可以被认为是具有高并发处理能力的。
反之,如果快餐店没有做好准备,点餐和制作食物的速度没有任何提高,那么顾客就会等待很长时间,队伍会变得越来越长,导致顾客不满和抱怨。
这就像一个网站或应用在促销活动或者突发事件时突然接收到大量的访问请求。如果这个网站或应用能够快速响应并为每个用户提供所需的服务,那么它就具备了高并发处理能力。如果没有这样的能力,那么用户可能会遇到页面加载缓慢或者无法加载的问题。
我们常说的系统的最大并发度是5000
当说一个系统的“最大并发是5000”时,它是指该系统能够同时处理5000个客户端或用户请求,而不会崩溃或导致性能明显下降。但是,这并不意味着它会同时处理5000个请求;它意味着它能够在一个特定的时间窗口内处理5000个独立的请求。
你可以把“最大并发数5000”理解为这样一个情景:你有一个超级强大的柜台,能够让5000个人同时排队等待服务。柜台可能有多个服务窗口(类比为多核CPU),能够同时服务多个客户(这是并行),但并不一定有5000个服务窗口同时为每个人服务;也可能是几个服务窗口在迅速地为这5000人中的一部分提供服务,然后再快速为下一部分提供服务(这是并发)。
所以,在实际运行中,系统会根据其资源和架构来决定是同时处理多少个请求(并行),还是通过高速切换来处理这些请求(并发)。
当你听到“系统的最大并发是5000”时,这通常是基于一些性能测试和调优,意味着系统已经被优化和配置为在高负载条件下仍能保持稳定和高效的运行。
我们常说的 mongodb 最大连接数 128
MongoDB的“最大连接数是128”是指MongoDB服务器能够同时处理128个客户端连接。在这里,"连接"是指客户端(比如一个应用程序或一个服务)和MongoDB服务器之间建立的通信通道。
通俗的解释:
想象 MongoDB 是一个大型的酒店。每个客户(客户端或应用程序的连接)都希望得到一个房间(一个数据库连接)。酒店有限的房间数量就代表了数据库的最大连接数。
MongoDB 的最大连接数并发是 128,这就像是说酒店有 128 个可供入住的房间。当第 129 个客户来到酒店时,他将不得不等待,直到有人离开酒店并释放一个房间。
这意味着,如果你的应用程序或系统有超过 128 个并发的请求想要连接到 MongoDB,超出的请求将不得不等待,直到有一个连接被释放。
这个数字(128)通常是基于特定的 MongoDB 配置或特定的硬件和操作系统限制来的。在实际生产环境中,为了满足更高的并发需求,管理员可能会调整配置和资源来提高这个限制。
总结
并行是并发的一种特殊情况:并行是并发的一种形式,当我们说系统是并行的时候,它一定是并发的,但反之则不成立,一个并发系统不一定是并行的。
当CPU 的核数是 1 的时候,这个时候是只有并发的,没有并行的。但是当 CPU 核数大于1,比如说是 4 的时候,这个时候就既有并发也有并行。
当我们的 CPU 核数是 4 的时候,我们程序用了四个线程去处理这些请求,系统一段时间内收到了 20 个请求,这个时候前面四个请求就会并行的执行,后面剩下的请求会去排队并发的执行,所以说不管你的 CPU 是多少核数的,系统都会存在并发。
并行可以看作是并发的一个子集,即当并发真正实现了“同时”执行多个任务时,就实现了并行。
在实际应用中,往往是并发和并行共同存在,相辅相成,共同提高系统的效能和性能。
后面我们又说了高并发的一些基础概念,其实“高并发”本质是指系统能够在单位时间内处理很多的任务或请求,这不仅仅是同时处理,还包括几乎同时处理。
例如,一个在线购物网站在“双十一”这一天可能会遇到极大的访问量,这时候系统就需要具备高并发的能力,来保证大量用户的请求都能够得到响应。
其实实现高并发有很多方法,比如:多线程和多进程、负载均衡、缓存技术、数据库优化、异步处理、分布式系统等。
这些方法我们下篇文章会详细说的,还有并发读、并发写、MVCC等也会再下一篇文章说的。
最后给大家送一个福利,大家只要关注 大圣数据星球 这个公众号,然后加我微信私聊我,就可以免费获得 韩顺平 价值万元的 VIP 的Java 课程。
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。