`

高并发系统中的常见问题

阅读更多

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

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

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
分享到:
评论

相关推荐

    Java 基础、并发、JVM、计算机网络、操作系统、MySQL、Redis、高并发设计等常见面试问题汇总

    Java 基础、并发、JVM、计算机网络、操作系统、MySQL、Redis、高并发设计等常见面试问题汇总。

    高并发Oracle数据库系统的架构与设计

    , 全书主要内容从三个维度展开:首先是内部扩展的维度,深入探讨了高效B树索引、高效表设计、查询优化器等数据库架构设计与优化的核心技术,以及高并发Oracle数据库系统架构与设计的方法论和常见的高并发案例;...

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

    该片是基于处理oracle数据库性能问题的经验写就,它是对常见的性能问题做的总结,它的适用范围: 高并发高负载的系统. 需要先申明的是: 对于所有的调优的方法,都是有适用范围的;

    简单实现Java高并发之秒杀系统

    秒杀系统是一种针对高并发场景下的抢购活动设计的系统,旨在克服大量用户同时访问和购买同一商品的挑战。以下是秒杀系统的概念描述: 1. **限流与并发控制**:秒杀系统需要通过限制每秒钟的请求数量或者设置并发...

    高并发Oracle数据库系统的架构与设计.pdf

    首先是内部扩展的维度,深入探讨了高效B树索引、高效表设计、查询优化器等数据库架构设计与优化的核心技术,以及高并发Oracle数据库系统架构与设计的方法论和常见的高并发案例;其次是纵向扩展的维度,国内首次详细...

    Java后端知识+Java并发系统设计

    带着你了解了高并发系统设计的三种通用方法:Scale-out、缓存和异步。这三种方法可以在做方案设计时灵活地运用,但它不是具体实施的方案,而是三种...了解了消息队列在高并发系统设计中起到的作用,以及一些注意事项,

    9种高性能高可用高并发的技术架构

    所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠运行等一系列问题与挑战。分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较...

    Springboot高并发限流、访问排队、熔断完整例子

    其次,应对大流量的一些常见手段是什么? 缓存:就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。 降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都拿到数据后,做个性化排序...

    互联网程序员都每天刷题嘛-high-concurrency-system-design:高并发系统设计的方法与思考

    Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。 2. 缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗...

    高并发场景防止库存数量超卖少卖

    在高并发电商场景下,商品超卖(即销售量超出库存)是常见问题,主要由并发扣减库存导致。常规做法是在扣减库存前检查库存充足性,但面对大量并发请求时,这种方法可能失效。为此,可采用以下几种策略: 悲观锁:在...

    常见的6种以上高并发处理有效措施

    对于大型网站来说,本资源提供的6种办法可能都会被同时使用到,具体实现过程中很多细节还需要大家慢慢熟悉和体会,有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大,希望大家一起讨论,达到...

    高可用高并发的一共 9 种技术架构解析.docx

    分层是企业应用系统中最常见的一种架构模式,将系统在横向...所以虽然分层架构模式最初的目的是规划软件清晰的逻辑结构以便于开发维护,但在网站的发展过程中,分层结构对网站支持高并发向分布式方向的发展至关重要。

    高并发IM系统架构优化实践

    摘要:介绍如何设计一个稳定、高并发、消息保序的IM系统,以及如何通过使用存储层的高级功能来优化系统架构。在构建社交IM和朋友圈应用时,一个基本的需求是将用户发送的消息和朋友圈更新及时准确的更新给该用户的...

    JAVA高质量并发详解,多线程并发深入讲解

    此外,书中还深入剖析了并发编程中的常见问题,如死锁、活锁、饥饿等,并提供了相应的解决方案和最佳实践。 本书注重理论与实践相结合,通过大量的示例代码和案例分析,帮助读者更好地理解和掌握并发编程的技巧和...

    使用JAVA开发的秒杀系统源码

    此外你学完这套课程可以利用“秒杀”这个系统,了解怎样打造一个高并发、高可用、高性能的系统架构。 你将收获: 常见业务场景当中的必备架构知识要点 高并发、高可用、高性能的系统架构技巧与方法 彻底理解...

    AS400应用系统性能优化

    从几个方面描述以as400作为数据库的应用系统的性能优化方法以及工具的使用

    redis令牌机制实现秒杀系统

    间有限的情况下导致的一个高并发以及高并发所带来的库存超卖的问题。 秒杀需要解决的问题: 1) 库存超卖 解决方案: 1) 悲观锁:synchronize 、 Lock 2) 乐观锁:数据库乐观锁版本号控制 2) 高并发情况下系统压力...

    亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构

    4、多机房部署架构下的4级缓存架构:大公司里真实的亿级流量高并发系统,都是采取了多个机房的部署架构,以实现高可用以及异地灾备。课程会重点讲解,在多机房部署架构下,如何设计和实现高并发系统的4级缓存架构。 ...

    Redis高并发秒杀和分布式锁技术应用及实战解析

    本课程旨在让你快速学习和掌握,基于Redis应用场景很...Redis的安装和环境搭建 高并发秒杀 Redis 实现分布式锁 Redis 实现微信群红包 Redis 实现项目实战讲解和代码演示thinkphp5 中如何使用 Redis常见的坑和问题交流

Global site tag (gtag.js) - Google Analytics