这意味着在某个时候,我们会突然开始发现我们无法将项目添加到缓存中而导致整个卡片卡瘫痪的能力出现了故障 。
主要搬迁我们确定了原因之一-我们的缓存服务器配置不正确 。
我们的主要逐出过程设置为永不撤离,并且在达到内存时抛出错误 。这就是导致我们在负载增加的情况下达到内存限制的原因 。
解决方案看起来很简单-将Redis缓存服务器上的密钥逐出设置为volatile-lru 。从理论上讲,这将确保只有带有TTL的键才会引起问题 。
如果真那么容易就好了这带来了系统从未设计过的其他挑战 。我们有很多值依赖于其他值进行重新计算,这些值又被用于计算其他值 。
因为缓存是临时构建的,而且是偶然的,所以这些项目中的一些预计会被缓存,而其他则不会,并且它们都有不同的TTL 。
收回一段时间未使用的密钥的行为可能会触发一系列的再生故障,从而使系统瘫痪 。
我们有一个难题:
· 我们需要逐出密钥,以确保不会耗尽内存
· 如果我们收回任意密钥,将导致值再生失败
· 从架构上讲,我们无法过渡到这些查询
· 我们受到运营成本的限制,因此我们无法扩展$
这个看似棘手的问题虽然简单易懂,却有一个简单的解决方案 。
后备缓存我在数据库层实现了后备缓存 。
对于我们通过cache_fields缓存的每个字段,我们还添加了随附的时间戳和缓存值:
cache_fields :total_raised
每当更新缓存的字段时,cache_fields函数将创建并更新两个额外的属性:
· cached_total_raised
· cached_timestamp_total_raised
每当在Redis缓存中找不到该值时,它将使用存储在数据库中的值,该值永远不会过期 。所得的提取速度比从Redis提取的速度慢,但比重新计算的速度快得多 。
如果数据库中没有缓存的值,它将重新计算该值 。
这确保了几乎在每种情况下,缓存值都以一种或另一种形式存在,从而阻止了计算的运行,除非该值由CacheUpdateJob强制更新或由客户成功团队要求手动更新 。
陈旧的缓存所有这些缓存都导致了一个问题-我们经常会遇到陈旧且不再准确的旧数据 。我们通常不知道其缓存在什么级别 。
一个小例子我们遇到的情况将向您显示一些后果 。
Account.find('12345a').campaigns.limit(10)
Account.find('12345a').campaigns.limit(20)
由于我只能将其描述为过于激进的查询缓存或ORM中的错误,因此如果连续运行,上述命令将返回相同的结果 。
如果您之后立即执行以下操作,您将获得更多有趣的结果:
Account.find('12345a').campaigns.limit(20).count
Account.find('12345a').campaigns.limit(20).to_a.length
奇怪的是,#count将返回20,但是#to_a将返回10 。
它带来了可怕的用户体验从用户体验的角度来看,这是不可接受的 。人们进行捐赠时,他们希望能够立即在总金额中看到新的捐赠 。他们不认为"哦,这个系统一定已经缓存了以前的值 。"
同样,缓存必须足够频繁地更新以跟踪筹款活动的进度 。客户成功管理团队每天与客户保持密切联系,并且必须提供进度报告 。如果报告已过时,他们将无法做到这一点 。
它造成了一些非常严重的潜在错误想象一下,如果要对集合进行范围界定以进行批量删除 。您以为您要删除20条记录,但实际上是在删除类似查询返回的先前的记录集 。
这就是噩梦,我希望您拥有良好的备份和审核表 。
解决方案—缓存清除工具我构建了多个工具,客户成功可使用这些工具来强制在特定队列上进行缓存刷新 。这样可以确保每当需要最新数据时,他们就可以拥有它们 。
通过将缓存的属性访问器更改为接受并使用一组可选参数,我现在可以在需要的任何时候强制刷新缓存:
@campaign.total_raised(force_refresh: true)
在对新鲜度敏感的操作中,这将确保每次都处理正确类型的数据 。
我还确保关键报告之类的功能使用了较薄的缓存层,并尽可能地利用了最新数据 。
最终结果

文章插图
在所有优化的最后,我们有了一个系统,可以处理我们预期的下一个数量级的负载-每秒2000个以上的请求,数千个并发活动 。大多数面向捐助者的端点的加载时间均少于50ms,而面向客户页面的加载时间则在300ms之内 。
这是一段漫长的旅程,进行了许多高压部署,但最终结果不言而喻 。最终,我们有了一个在赠予日中可以忽略的系统-大部分情况下 。
推荐阅读
- 为远程办公筑起“安全屋”,这七只网络安全股将水涨船高?
- 我的 Linux 故事:用开源打破语言壁垒
- Linux 网络编程之如何使用函数库libnet详解
- win10黄屏的两种解决办法
- win10怎么一键网络共享
- 你如何理解敏捷开发?
- 猪的智商排名 猪的智商在动物界排第几名
- 传说中的鬼房子 有鬼的房子
- 谁不是蜀汉五虎上将中的一员 三国演义中蜀国的五虎大将里被称为常胜将军的是谁?
- 如何装修以后感觉空间大了不少?
