高并发系统中的常见问题

李潇然 李潇然     2022-08-26     310

关键词:

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

 

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

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

乐观锁

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

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

悲观锁

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

一般需要使用数据库的锁机制,比如MysqlInnoDB引擎的行级锁

结论:在实际生产环境中,如果并发量不大且不允许脏读(原始数据为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,依靠数量众多的前端机来抗极热点请求。



高并发的常见应对方案

一、关于并发我们说的高并发是什么?在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来。 高并发,通常关心的系统指标与业务指标?QPS:每秒钟查询量,广义的,通常指指每秒请求数响应时间:从... 查看详情

高并发高负载的大型站点系统架构

大型站点的系统架构须要考虑非常多问题。大型站点有高并发高负载的特点,在面对大量用户訪问、高并发请求方面。主要的解决方式集中在这样几个环节:使用高性能的server、高性能的数据库、高效率的编程语言、还有高性能... 查看详情

高并发系统之限流特技

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

高并发处理思路与手段:扩容

当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展。选用哪种策略主要依赖于要解决的问题以及系统资源的限制。在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点。如果你已经有一个... 查看详情

java面试常问题:如何设计一个高并发系统?你该如何优雅的回答

面试原题如何设计一个高并发系统?面试官心理分析说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的JD里都是说啥,有高并发就经验者优先。如果你确实有真才实学... 查看详情

如何设计一个高并发系统

其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼?我说的浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到每秒并发两三... 查看详情

如何设计一个高可用高并发秒杀系统

作者:vincentsu,腾讯PCG后台开发工程师如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从0到1完整践行海量服务。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一... 查看详情

聊聊高并发系统之限流特技(代码片段)

  在开发高并发系统时,有很多手段用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉... 查看详情

缓存在高并发场景下的常见问题

缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的... 查看详情

缓存在高并发场景下的常见问题

缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的... 查看详情

如何搭建亿级并发的系统架构?

想设计亿万级高并发架构,你要先知道高并发是什么?面对流量高峰,不同的企业是如何通过技术手段解决高并发难题的呢?0、引言软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道... 查看详情

聊聊高并发系统之限流特技-1开涛

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

高并发限流策略

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,... 查看详情

如何设计一个高并发系统

...库,这样本来就一个库,现在多个数据库,不也可以抗高并发么。   缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存不就得了。毕竟人家red... 查看详情

高并发场景下的缓存有哪些常见的问题?

...动更新缓存中的数据或者移除对应的缓存。 二、缓存并发问题缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据, 查看详情

大型网站的架构设计问题----大型高并发高负载网站的系统架构

...过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下。一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果... 查看详情

nginx高并发实现原理学习

...传统的服务器多线程业务逻辑设计在大量用户访问时支撑并发连接的能力有限,不利于构建高性能服务器架构。Nginx作为当下的高并发连接的负载均衡服务器因其极强的性能得到广泛的使用。本文主要对高并发Nginx进行详细的... 查看详情

高并发,你真的理解透彻了吗?

参考技术A高并发,几乎是每个程序员都想拥有的经验。原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时、CPUload升高、GC频繁、死锁、大数据量存储等等,这些问题能推动我们在技术深度上不断精进... 查看详情