【问题标题】:How to avoid dog-pile effect at Node.js & MongoDB & Redis stack?如何在 Node.js & MongoDB & Redis 堆栈中避免狗堆效应?
【发布时间】:2015-08-20 11:16:48
【问题描述】:

当某些缓存值过期或由于任何原因将生成新的缓存并且我们在不存在缓存时有巨大的流量时,MongoDB 上的负载会很重,并且响应时间会显着增加。这通常称为“狗桩效应”。创建缓存后一切正常。

我知道这是一个非常常见的问题,适用于所有使用数据库和缓存系统的 Web 应用程序。

应该怎么做才能避免Node.js & MongoDB & Redis 堆栈中的狗堆效应?最佳做法和常见错误是什么?

【问题讨论】:

  • 我真的很想知道投票者是否真的听说过所谓的狗桩效应。

标签: javascript node.js mongodb caching redis


【解决方案1】:

防止狗堆积的一种经过充分验证的方法是保留一个“锁”(例如在 Redis 中),以防止缓存填充逻辑多次触发。第一次调用 fetcher 时(对于给定的内容),获取锁(对于它)并设置为过期(例如使用 SET ... NX EX 60)。任何后续对该内容的 fetcher 调用都将在获取锁时失败,因此只有一只狗可以到达堆。

您可能想要实施的另一件事是对提取器的某种速率限制,无论内容如何。使用 Redis 也很容易做到这一点 - 随时查看或提出其他问题 :)

【讨论】:

  • 在redis中设置全局锁会使问题更加复杂。如果无法获得锁,会怎样? sleep 或 spin lock 以检查更新是否成功或等待某些条件(如 Java 中的条件)?
【解决方案2】:

我只提供过期的内容,直到新内容缓存完成,这样数据库就不会被踩踏。

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 2010-12-04
    • 2010-11-30
    • 2012-09-23
    • 2011-11-23
    • 2020-03-08
    • 2011-09-21
    • 2014-04-13
    • 2015-11-14
    相关资源
    最近更新 更多