【浅淡程序“三高”:高并发,高性能,高可用】



一、什么是高并发?

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一。当多个进程或线程同时(或着说在同一段时间内)访问同一资源时会产生并发问题,因此需要通过专门的设计来保证系统能够同时(并发)正确处理多个请求。举个小例子,例如当下课了,大伙一起冲出教室的门去食堂抢饭,但是教室的后面锁着,大家只能从前门走,这时候就可能会造成堵塞等情况。但是如果后门打开了,而且窗户也打开了 ,大伙就可以有的从后面走,有的跳窗走等等,都能去食堂打到饭的情况就是高并发。

二、什么是高性能?

高性能(High Performance)就是指程序处理速度快、耗能少。与性能相关的一些指标如下:

  • 响应时间:系统对请求做出响应的时间。例如系统处理一个 HTTP 请求需要 200ms,这个 200ms 就是系统的响应时间。
  • 吞吐量:单位时间内处理的请求数量。
  • TPS:每秒响应事务数。
  • 并发用户数:同时承载能正常使用系统功能的用户数量。

三、什么是高可用

通常用来描述一个系统经过专门的设计,从而减少停工时间,保证服务的持续可用。

四、如何有效实现高并发

1.垂直方向扩展,也叫竖向扩展

垂直方向:提升单机能力
提升单机处理能力又可分为硬件和软件两个方面:

  • 硬件方向,很好理解,花钱升级机器,更多核更高主频更大存储空间更多带宽
  • 软件方向,包括用各快的数据结构,改进架构,应用多线程、协程,以及上性能优化各种手段

2.水平方向扩展,也叫横向扩展

水平方向:分布式集群
为了解决分布式系统的复杂性问题,一般会用到架构分层和服务拆分,通过分层做隔离,通过微服务解耦。
这个理论上没有上限,只要做好层次和服务划分,加机器扩容就能满足需求,但实际上并非如此,一方面分布式会增加系统复杂性,另一方面集群规模上去之后,也会引入一堆AIOps、服务发现、服务治理的新问题。
因为垂直向的限制,所以,我们通常更关注水平扩展,高并发系统的实施也主要围绕水平方向展开。

3.实现高并发的关键技术

1.集群化:负载均衡

负载均衡就是把负载(request)均衡分配到不同的服务实例,利用集群的能力去对抗高并发,负载均衡是服务集群化的实施要素

2.数据库层面:分库分表+读写分离

就是把一个库分成多个库,部署在多个数据库服务上,主库承载写请求,从库承载读请求。从库可以挂载多个,因为很多场景写的请求远少于读的请求,这样就把对单个库的压力降下来了。
如果写的请求上升就继续分库分表,如果读的请求上升就挂更多的从库,但数据库天生不是很适合高并发,而且数据库对机器配置的要求一般很高,导致单位服务成本高,所以,这样加机器抗压力成本太高,还得另外想招。

3.读多写少:缓存

缓存的理论依据是局部性原理。
一般系统的写入请求远少于读请求,针对写少读多的场景,很适合引入缓存集群。
在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求,因为缓存集群很容易做到高性能,所以,这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。
缓存的命中率一般能做到很高,而且速度很快,处理能力也强(单机很容易做到几万并发),是理想的解决方案。
CDN本质上就是缓存,被用户大量访问的静态资源缓存在CDN中是目前的通用做法。

4.高写入:消息中间件

相同的资源下,数据库系统太重太复杂,所以并发承载能力就在几千/s的量级,所以此时你需要引入别的一些技术。
比如说消息中间件技术,也就是MQ集群,它是非常好的做写请求异步化处理,实现削峰填谷的效果。
消息队列能做解耦,在只需要最终一致性的场景下,很适合用来配合做流控。
消息队列本身也跟缓存系统一样,可以用很少的资源支撑很高的并发请求,用它来支撑部分允许异步化的高并发写入是很合适的,比使用数据库直接支撑那部分高并发请求要减少很多的机器使用量。

5.避免挤兑:流控

再强大的系统,也怕流量短事件内集中爆发,就像银行怕挤兑一样,所以,高并发另一个必不可少的模块就是流控。流控的关键是流控算法

  • 1.计数器算法(固定窗口)
  • 2.滑动窗口算法
  • 3.漏桶算法
  • 4.令牌桶算法

总结

高并发和高性能是紧密相关的,提高应用的性能,可以提高系统的并发能力。所以上面主要介绍了解决高并发所带来的问题的有效方案。
详情请查询:https://www.jb51.net/article/212772.htm
注意:此文章为学习记录文章,参考多篇文章,如有不正之处请指教

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java高并发程序设计是指在Java编程语言中,能够有效地处理大量并发请求的程序设计方法和技巧。 首先,Java高并发程序设计需要利用多线程来处理并发请求。通过创建多个线程来同时处理不同的任务,可以提高程序的并发处理能力。可以使用Java内置的Thread类或者实现Runnable接口来创建多线程,并且可以使用线程池来管理线程的创建和销毁,以提高效率。 其次,Java高并发程序设计需要考虑线程安全性。由于多个线程同时访问共享数据可能会引发数据竞争和不一致的问题,因此需要使用同步机制来确保线程的安全性。可以使用synchronized关键字、Lock接口等来实现线程的同步操作,并保证数据的一致性。 另外,Java高并发程序设计还需要考虑资源管理和性能优化。并发程序往往需要频繁地进行数据读写、线程调度等操作,因此需要合理地管理资源,避免资源的过度竞争和浪费。可以使用线程池来管理线程,并配置合适的线程池大小、线程池参数等来提高程序的性能。 此外,还可以使用非阻塞I/O、异步编程等技术来提高程序的响应速度和并发能力。非阻塞I/O可以减少线程等待的时间,提高I/O操作的效率。异步编程可以减少线程的阻塞时间,提高程序的并发处理能力。 总之,Java高并发程序设计是一门复杂的技术,涉及线程管理、数据同步、资源管理和性能优化等方面。通过合理地使用多线程、同步机制和优化技术,可以提高Java程序的并发处理能力,从而更好地满足大量并发请求的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值