处理高流量站点缓存时的并发问题

     2023-02-23     280

关键词:

【中文标题】处理高流量站点缓存时的并发问题【英文标题】:Dealing with concurrency issues when caching for high-traffic sites 【发布时间】:2014-06-11 18:41:09 【问题描述】:

我在一次采访中被问到这个问题:

对于高流量网站,有一种方法(比如 getItems())会被频繁调用。为了防止每次都去数据库,结果被缓存了。但是,可能有成千上万的用户同时尝试访问缓存,因此锁定资源不是一个好主意,因为如果缓存过期,则会调用数据库,所有用户都会拥有等待数据库响应。什么是处理这种情况的好策略,以便用户不必等待?

我认为这是当今大多数高流量网站的常见情况,但我没有处理这些问题的经验——我有处理数百万条记录的经验,但不是数百万用户。

如何学习高流量网站所使用的基础知识,以便在未来的面试中更有信心?通常我会开始一个业余项目来学习一些新技术,但不可能在旁边建立一个高流量的网站:)

【问题讨论】:

apachebench (ab) 是一个产生流量的串行请求工具。此外,grindr、wkr 和其他几个实现了可用于模拟高流量网站的并行流量生成器。 【参考方案1】:

Cache miss-storm 或 Cache Stampede Effect,是缓存失效时对后端的请求突发。

我处理过的所有高并发网站都使用了某种缓存前端。无论是 Varnish 还是 Nginx,都具有微缓存和踩踏效应抑制。

只需在谷歌上搜索 Nginx 微缓存或 Varnish 踩踏效果,您就会找到大量此类问题的真实示例和解决方案。

一切都归结为当后端处于 Updating 或 Expired 状态时,您是否允许请求通过缓存到达后端。

通常可以主动刷新缓存,保存对更新条目的所有请求,然后从缓存中提供它们。

但是,总是有“你应该缓存什么样的数据”的问题,因为,你看,如果它只是纯文本文章,它会得到编辑/更新,延迟缓存更新不是比您的数据准确地显示在数千台显示器(实时游戏、金融服务等)上更成问题。

所以,正确的答案是,微缓存,抑制踩踏效应/缓存未命中风暴,当然还要知道何时、如何以及为什么缓存哪些数据。

【讨论】:

【参考方案2】:

您可能会更好地使用一些分布式缓存存储库,如memcached,或其他取决于您的访问模式。 如果要将值存储在应用程序中,可以使用 Cache implementation of Google's Guava library。 从编码的角度来看,您需要类似

public V get(K key)
    V value = map.get(key);
    if (value == null) 
        synchronized(mutex)
            value = map.get(key);
            if (value == null) 
                value = db.fetch(key);
                map.put(key, value);
            
        
    
    return value;

其中映射是 ConcurrentMap 而互斥体只是

private static Object mutex = new Object();

通过这种方式,每个缺失的键只有一个对数据库的请求。

希望对您有所帮助! (并且不要存储空值,您可以创建一个墓碑值!)

【讨论】:

【参考方案3】:

答案是缓存永不过期,并有一个后台进程定期更新缓存。这避免了等待和缓存未命中风暴,但是为什么在这种情况下使用缓存呢?

如果您的应用会因“缓存未命中”情况而崩溃,那么您需要重新考虑您的应用以及什么是缓存以及所需的内存数据。对我来说,我会使用在数据更改或定期更改时更新的内存数据库,而不是缓存,并避免上述情况。

【讨论】:

【参考方案4】:

您真的需要使缓存过期吗?您是否有一个增量更新机制,您可以使用它始终定期增加数据,这样您就不必使数据过期,而是继续定期刷新它。

其次,如果您想防止太多用户一次性访问数据库,您可以在存储过程中设置一个锁定机制(如果您的数据库支持),以防止太多人同时访问数据库.此外,你可以在你的数据库中拥有一个缓存机制,这样如果有人再次从数据库中请求完全相同的数据,你总是可以返回一个缓存值

一些应用程序还在应用程序和数据库之间使用第三个服务层来保护数据库免受这种情况的影响。服务层确保你在数据库中没有缓存未命中风暴

【讨论】:

【参考方案5】:

你在面试中被问到的问题是所谓的Cache miss-storm——一个很多用户触发缓存再生的场景,以这种方式打击数据库。

为了防止这种情况,首先您必须设置软到期日期和硬到期日期。假设硬到期日期是 1 天,软到期日期是 1 小时。硬是在缓存服务器中实际设置的,软是在缓存值本身(或在缓存服务器中的另一个键中)。应用程序从缓存中读取,发现软时间已过期,将软时间设置为提前 1 小时并命中数据库。这样下一个请求会看到已经更新的时间,不会触发缓存更新——它可能会读取过时的数据,但数据本身会处于重新生成的过程中。

下一点是:您应该有缓存预热程序,例如而不是用户触发缓存更新,而是在您的应用程序中预先填充新数据的过程。

最坏的情况是例如当您没有任何数据时,重新启动缓存服务器。在这种情况下,您应该尽可能快地填充缓存,并且热身过程可能会发挥重要作用。即使您在缓存中没有值,“锁定”缓存(将其标记为正在更新)也是一个很好的策略,只允许对数据库进行一次查询,并通过请求资源在应用程序中进行处理在给定的超时后再次

【讨论】:

【参考方案6】:

仅当数据消费者准备好获取陈旧日期(在合理范围内)时,才考虑缓存的特定数据类型更糟糕。

在这种情况下,您可以定义 invalidation/eviction/update 政策以使您的数据保持最新(在商业意义上)

更新时,您只需替换缓存中的数据项,所有新请求都将以新数据响应

示例:股票信息系统。如果您不需要实时价格信息,保留缓存库存并通过昂贵的远程调用每 X mils/sec 更新一次是合理的。

【讨论】:

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

...击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验。我们常见的高并发场景有:淘宝的双11、春运时的抢票、微博大V的热点新闻等。除了这些典型事情,每秒几十万请求的秒杀系统、每天千万级... 查看详情

分布式问题

...缓存架构?  节选自:  【中华石杉】亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 P1如何让redis集群支撑几十万QPS高并发+99.99%高可用+TB级海量数据+企业级数据备份与恢复?:Redis企业级集群架... 查看详情

大流量高并发系统之限流特技

...级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场... 查看详情

高并发流量控制

  以前没关注过,这里只学的是单机的处理方式。1.什么是大流量  大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。  其实并没有一个绝对的数字,如果这个量造成了系统的压... 查看详情

高并发大流量站点架构简单思路

...时候额外储备一部分,以备不时之需2.特别监控网络数据流量是否正常。如是否有大规模的爬虫、DDOS等浑水摸鱼,能够针对iP和Cookie的限流3.使用CDN同一时候做一些必要的算法改造,动静分离************************* 查看详情

高并发限流策略

...级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存... 查看详情

京东高并发秒杀解决方案

...有效控制商品超卖是秒杀系统不可避免的一个问题;异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,当然异步处理也是削峰的一种实现方式。内存缓存:秒杀系统最大的瓶颈一般都是数据... 查看详情

高并发系统之限流特技

...级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存... 查看详情

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术。然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多... 查看详情

高并发情况利用锁机制处理缓存未命中

...至于缓存在并发情况下会产生的一系列问题都已经被框架处理好了,我所做的只是set和get,至于使用时缓存在并发情况下到底会出现什么样的问题,该如何去解决和避免这些问题,没有去深究。  秉着“学而时习之”的态度(... 查看详情

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

...降级和限流。缓存的目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰过去或者问题解决后再打开的场景;而有些场景并不... 查看详情

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

...级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存... 查看详情

大流量高并发量网站的解决方案

1,首先检查硬件配置是否够用,包括cpu,内存,网卡,磁盘,如果不行就只能增加配置;2,可以使用浏览器缓存机制,将一些用户的请求的数据缓存在客户浏览器上,这样可以解决单个用户重复操作所产生的负载;3,可以使用... 查看详情

大厂面试01期高并发场景下,如何保证缓存与数据库一致性?

面试题:高并发场景下,如何保证缓存与数据库一致性?问题分析我们日常开发中,对于缓存用的最多的场景就像下图一样,可能仅仅是对数据进行缓存,减轻数据库压力,缩短接口响应时间。这种方案在不需要考虑高并发得去... 查看详情

2023春招面试专题:高并发解决方案

...;这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验。我们常见的高并发场景有:淘宝的双11、春运时的抢票、微博大V的热点新闻等。除了这些典型事情,每秒几十万请求的秒杀系统、... 查看详情

2023春招面试专题:高并发解决方案

...;这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验。我们常见的高并发场景有:淘宝的双11、春运时的抢票、微博大V的热点新闻等。除了这些典型事情,每秒几十万请求的秒杀系统、... 查看详情

架构设计|高并发流量削峰,共享资源加锁机制(代码片段)

...里一、高并发简介在互联网的业务架构中,高并发是最难处理的业务之一,常见的使用场景:秒杀,抢购,订票系统;高并发的流程中需要处理的复杂问题非常多,主要涉及下面几个方面:流量管理,逐级承接削峰;网关控制,... 查看详情

架构设计|高并发流量削峰,共享资源加锁机制(代码片段)

...里一、高并发简介在互联网的业务架构中,高并发是最难处理的业务之一,常见的使用场景:秒杀,抢购,订票系统;高并发的流程中需要处理的复杂问题非常多,主要涉及下面几个方面:流量管理,逐级承接削峰;网关控制,... 查看详情