`

高并发系统中的常见问题

 
阅读更多

原文出处: 卫向军(@卫向军_微博)   欢迎分享原创到伯乐头条

本文一共分析了三个案例,分别介绍并发系统中的共享资源并发访问、计算型密集型任务缓存访问 、单一热点资源峰值流量问题和解决方案。

1:订票系统,某车次只有一张火车票,假定有1w个人同时打开12306网站来订票,如何解决并发问题?

A1: 首先介绍数据库层面的并发访问,解决的办法主要是乐观锁和悲观锁。

乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

乐观锁使用一个自增的字段表示数据的版本号(或者timestamp),更新的时候检查版本号是否一致,比如数据库中版本号为4,更新时版本号使用版本号version=5,与数据库中的版本号version+1=(5)做比较,如果相等,则可以更新,如果不相等,其他程序已更新该记录,返回错误。

悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整行的操作。

结论:在实际生产环境中,如果并发量不大且不允许脏读(原始数据为5,AB两个事务,B其他事务更新数据为2,事务未提交时,A读取到的仍然为5),可以使用悲观锁。并发访问量大时,使用悲观锁有非常大的性能问题,可以选择乐观锁。

其次,介绍一下Memcached的CAS机制

CAS,又称Compare-and-Swap,代表一种原子操作。

Memcached的CAS机制解决的问题及其原理:

1. 实现了Check-and-Set原子操作功能;
2. 其使用方式为:首先使用gets指令一个key-value及key对应value的版本号;其次操作产生新的value值;最后使用cas指令重新提交key-value,并附带刚刚获得到的版本号;
3. 当服务端判断cas操作中的版本号不是最新的时,则认为改key的值已经被修改,本次cas操作失败。程序设计人员通过CAS机制可实现自增和自减的原子操作;

可以看到MemCache的CAS机制和数据库的乐观锁实现原理非常类似。

Q2:假设系统中图片存储在TFS(Taobao File System)中,接口提供缩略图服务,首先在缓存中查找是否有缩略图,如果没有,则从TFS加载原图片,然后请求缩略图服务,缩略图计算完成后,设置回缓存服务中。

遇到的问题:当一张图片分享给100w个人以后,同一时间有1w个并发请求,由于缩略图计算耗时较长(假设1s), 在这1s内,每个请求查询缓存都没有找到然后申请计算缩略图,导致重复的缩略图计算量和资源消耗。

 

 

A2:对于缩略图这种耗时的服务,非常适合使用缓存,不过在使用的时候,对于同一个图片,原则上只需要计算一次缩略图,在缩略图未计算完成时,可以对每张图片做额外的标记表示其正在Processing,并发请求遇到缩略图Processing时,可以等待缩略图计算完成(这是建议的方式)后从缓存直接读取,也可以是直接返回错误,通过客户端重试来解决。

本案例中,如果缩略图请求在上传图片1分钟后才发生,则可以在后台预先计算缩略图并存储到缓存。另外就是在上传图片的时候计算缩略图,不过会增加上传图片的时间。

Q3:单点峰值流量,在并发系统中,除了请求整体的并发量高,还常见单一热点资源的并发请求量很高。例如,1万个人每人分享了一张图片,其中9999张图片的缩略图请求在10 QPS以内,剩下的一张图片为新闻热点图片,峰值请求在10万QPS左右, 系统会遇到的容量问题包括:1)接口前端机容量不够;2)缓存资源单实例遇到瓶颈。 

A3:针对单点峰值流量可能遇到的性能瓶颈,解决方案如下。

1)接口层容量不够:这个问题比较简单,只要接口层设计是无状态的,当容量达到预警线,可以通过快速水平扩容解决。

2)缓存资源单实例遇到性能瓶颈:如果使用的是分布式缓存,当希望突破单一key的访问瓶颈时(这个瓶颈既有可能是CPU资源紧张,也有可能是单机网络带宽跑满,还有可能是磁盘IO吞吐不够),一个办法是分布式缓存做多副本(x3)冗余设计,这样系统的吞吐量(x3)可以提高3倍,不过成本也提高3倍。另外一个办法是针对极热点数据,除了分布式缓存,同时在前端机上打开localCache,依靠数量众多的前端机来抗极热点请求。

  • 大小: 57.4 KB
分享到:
评论

相关推荐

    阿里P9纯手打亿级高并发系统设计手册1.pdf

    Scale-out是分而治之的一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。 Scale-out可以突破单机的限制,但是也会引入一些复杂问题,例如如果某个节点出现...

    P9纯手打亿级高并发系统设计手册.pdf

    Scale-out 是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。缓存是使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。异步是...

    Java系统的高并发解决方法详解

    Java系统的高并发解决方法详解 Java系统的高并发解决方法详解主要介绍了Java系统的高并发解决方法,内容十分丰富,在这里分享给大家,需要的朋友可以参考。一个小型的网站,比如个人网站,可以使用最简单的html...

    高并发的常见应对方案

    对于高并发系统,我们需要关注以下几个关键指标: 1. **QPS(Queries Per Second)**:每秒钟的查询次数。这是衡量系统处理能力的重要指标之一。 2. **响应时间**:从客户端发起请求到接收到响应的时间长度。理想...

    java抽奖系统后台 springboot+mybatis redis队列处理高并发.rar

    在构建一个基于Java的抽奖系统后台时,采用SpringBoot、MyBatis以及Redis队列来处理高并发场景是一项常见的技术选型。以下将详细介绍这些关键组件及其在抽奖系统中的作用。 1. **SpringBoot** SpringBoot是Spring...

    45_说说一般如何设计一个高并发的系统架构?.zip

    在IT行业中,设计一个高并发的系统架构是一项关键任务,特别是在大数据时代,处理大量...而“01_高并发系统的架构组成.png”图像可能直观地展示了这些组件如何协同工作,帮助我们更好地理解高并发系统架构的设计思路。

    oracle 高并发高负载情况下常见的3种性能问题

    ### Oracle高并发高负载下的三种常见性能问题 #### 一、OS swapping/paging引发的数据库并发性能问题 在Oracle数据库运行过程中,对于诸如latch/mutex这类轻量级的“锁”,我们通常期望它们能够迅速地被获取和释放...

    高并发秒杀系统

    总结,这个项目展示了如何运用SSM框架和前端技术构建一个高并发的秒杀系统,涉及了从后端架构设计、数据库交互、高并发处理策略到前端用户体验等多个层面的技术要点。通过学习和实践,开发者可以提升在大型项目中的...

    java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip

    在本项目中,"java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip",我们可以探索几个关键的IT技术及其在构建高效抽奖系统中的应用。以下是对这些技术的详细说明: 1. **SpringBoot**: SpringBoot是...

    阿里巴巴十亿级并发系统设计word版(2021版)

    在IT行业中,尤其是在互联网领域,高并发系统的构建是至关重要的,因为这直接影响到服务的稳定性和用户体验。"阿里巴巴十亿级并发系统设计"探讨的就是如何应对大规模并发流量,确保系统的高效运行。以下是对高并发...

    第04章 大促高并发系统下JVM如何调优指导03.pdf

    【标题】: "第04章 大促高并发系统下JVM如何调优指导03.pdf" 在大型促销活动期间,高并发系统的性能优化至关重要,尤其是Java虚拟机(JVM)的调优,它直接影响应用程序的响应速度和稳定性。本章节主要探讨了在亿级...

    深入理解高并发编程-核心技术原理

    **面试篇**包含了高并发场景下的优化策略和常见问题,比如优化加锁方式可能导致的死锁,缓存穿透、击穿和雪崩的现象及其解决方案,以及Java中synchronized和Lock的区别和使用场景。 **系统架构篇**涉及高并发下的...

    Java高并发视频教学,并带实战java高并发程序设计,高并发面试题目

    Java高并发编程是Java开发中的重要领域,尤其在大规模分布式系统和互联网应用中,对高并发处理能力的要求日益提升。本资源包含了一套完整的Java高并发视频教学,以及相关的实战项目和面试题目,旨在帮助开发者深入...

    亿级流量网站架构核心技术高并发系统

    在构建一个能够处理亿级流量的网站架构时,核心技术与高并发系统的设计是至关重要的。这类系统必须具备高效的数据处理能力、稳定的服务性能以及灵活的扩展性,以应对大规模用户访问带来的挑战。以下是对这些核心知识...

    高并发解决方案

    在IT行业中,高并发解决方案是针对大量用户同时访问或操作同一系统、应用或服务时,保证系统稳定、高效运行的技术策略。高并发场景通常出现在互联网服务、电子商务、社交媒体、在线游戏以及大数据处理等领域。以下是...

    高并发系统优化

    分布式缓存是高并发系统中的关键技术之一,它可以显著减轻数据库的压力,提高系统的整体性能。常见的分布式缓存方案有Redis、Memcached等。通过合理设置缓存策略,比如数据缓存、页面缓存等,可以大幅减少对数据库的...

    高并发服务端分布式系统设计概要

    在IT行业中,高并发服务端分布式系统设计是构建大规模、高性能应用的核心技术。这篇文档将带你深入了解这个领域的关键概念和实践策略。 首先,我们需要理解什么是“高并发”。高并发是指在短时间内,系统能够同时...

Global site tag (gtag.js) - Google Analytics