分布式,避免高并发

       高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

——什么是高并发你如何避免高并发?

通常:高并发相关常用的一些指标有响应时间,吞吐量,每秒查询率QPS,并发用户数等。

 

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。

吞吐量:单位时间内处理的请求数量。

QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

如何提升系统的并发能力

互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)

垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:

(1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;

(2)提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;

在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。

不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展。

水平扩展:只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,以及互联网公司架构各层常见的水平扩展实践,是本文重点讨论的内容。

 


常见互联网分布式架构如上,分为:

(1)客户端层:典型调用方是浏览器browser或者手机应用APP

(2)反向代理层:系统入口,反向代理

(3)站点应用层:实现核心应用逻辑,返回html或者json

(4)服务层:如果实现了服务化,就有这一层

(5)数据-缓存层:缓存加速访问存储

(6)数据-数据库层:数据库固化数据存储

整个系统各层次的水平扩展,又分别是如何实施的呢?

 

四、分层水平扩展架构实践

反向代理层的水平扩展


反向代理层的水平扩展,是通过“DNS轮询”实现的:dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。

当nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加一个外网ip,就能扩展反向代理层的性能,做到理论上的无限高并发。

 

站点层的水平扩展
站点层的水平扩展,是通过“nginx”实现的。通过修改nginx.conf,可以设置多个web后端。

当web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的无限高并发。

服务层的水平扩展
服务层的水平扩展,是通过“服务连接池”实现的。

站点层通过RPC-client调用下游的服务层RPC-server时,RPC-client中的连接池会建立与下游服务多个连接,当服务成为瓶颈的时候,只要增加服务器数量,新增服务部署,在RPC-client处建立新的下游服务连接,就能扩展服务层性能,做到理论上的无限高并发。如果需要优雅的进行服务层自动扩容,这里可能需要配置中心里服务自动发现功能的支持。

 

数据层的水平扩展

在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,以达到扩充系统性能的目的。

 

互联网数据层常见的水平拆分方式有这么几种,以数据库为例:

按照范围水平拆分

 

——总结

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。前者垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是后者:水平扩展。

互联网分层架构中,各层次水平扩展的实践又有所不同:

(1)反向代理层可以通过“DNS轮询”的方式来进行水平扩展;

(2)站点层可以通过nginx来进行水平扩展;

(3)服务层可以通过服务连接池来进行水平扩展;

(4)数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;

额外还可以通过使用缓存,以及动态页面生成来缓解高并发

各层实施水平扩展后,能够通过增加服务器数量的方式来提升系统的性能,做到理论上的性能无限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在高并发下,可以使用 Redis 的 SETNX 命令来实现分布式锁。SETNX 指令是将 key 的值设为 value,当且仅当 key 不存在。 步骤如下: 1. 使用 SETNX 命令尝试获取锁,如果返回值为 1,则说明获取锁成功。 2. 使用 EXPIRE 命令为锁设置过期时间,防止死锁。 3. 在业务代码执行完成后,使用 DEL 命令释放锁。 为了防止网络延迟等问题,可以在获取锁时设置一个随机值,并在释放锁时判断该值是否与当前锁对应的值相同,以确保只有持有锁的客户端才能释放锁。 ### 回答2: 高并发下Redis分布式锁的实现是通过Redis的setnx命令和expire命令来实现的。 首先,通过setnx命令尝试设置一个带有过期时间的key,如果成功设置,则表示获取到了分布式锁。如果设置失败,说明锁已经被其他客户端占用,需要等待或进行重试。 为了防止因为某个客户端处理时间过长而导致锁过期的情况,可以为锁的过期时间设置一个合理的值。在获取到锁后,可以使用expire命令为锁的key设置过期时间,确保在一定时间内释放锁。 为了提高锁的安全,可以为每个客户端设置一个唯一的ID作为锁的值,并将锁名称与该ID进行绑定。这样可以确保只有获取锁的客户端才能释放锁,防止其他客户端误释放锁。 另外,考虑到高并发情况下的锁竞争,可以在获取锁失败后进行等待一段时间再进行重试,避免频繁的锁竞争对系统能造成负面影响。 需要注意的是,Redis分布式锁的实现并不能解决所有并发问题,仅适用于单个业务场景下的加锁和释放锁操作。在设计和使用时需要考虑到具体业务需求和场景,并进行适当的优化和调整。 ### 回答3: 在高并发场景下,为了保证数据的一致和并发执行的正确,常常需要使用分布式锁来控制对共享资源的访问。Redis作为一个高能的内存键值存储系统,也可以用来实现分布式锁。 Redis实现分布式锁的一种常见方式是使用SETNX命令。当多个客户端同时尝试获取锁时,只有一个客户端能成功执行SETNX操作,即将对应的key设置为1,表示获取了锁。其他客户端获取锁失败,需要等待锁被释放后重新尝试。 为了保证锁的正确和防止死锁,还需要为锁设置一个合理的过期时间,以防止获取锁的客户端因为异常情况导致无法及时释放锁。 在高并发环境下,为了提高锁的能,可以考虑使用红锁机制。红锁是将分布式锁与Redis的复制功能相结合,确保在大部分节点上都获取到锁后,才认为锁已经获得。这样可以避免某个节点出现故障或网络异常导致锁丢失的情况。 另外,为了避免因为程序异常导致锁无法释放的情况,可以在获取到锁之后,使用Lua脚本来保证在一个原子操作中判断锁的状态并释放锁。 在实现分布式锁时,还需要考虑高并发下锁的能问题。可以通过优化Redis的部署结构、增加Redis的内存和CPU资源,以及使用连接池等方法来提高Redis的能和并发能力,从而提高分布式锁的能。 综上所述,高并发下的Redis分布式锁的实现主要包括使用SETNX命令获取锁、设置合理的超时时间、使用红锁机制增强锁的可靠、使用Lua脚本保证原子操作、优化Redis的能和并发能力等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值