大型分布式系统中缓存设计的三种策略

好吧,我们大家都知道,缓存-称为CASH-是用于在计算环境中临时存储某些内容的硬件或软件,如果您想真正详细了解它的实际工作方式,可以在此处通过其定义进行了解 :本文假定读者对缓存作为一个概念有一定的了解。

我们知道,最有趣的应用程序无法再单独执行,因此,现代应用程序是由许多组件构建而成的,并且这些组件彼此交互,在当今时代,我们将它们称为分布式系统。

当事物变得分布式时,它也将具有其优点和缺点,因为维护和开发这些系统的成本和复杂性非常高,尽管如此,这仍然是满足当今Internet应用程序需求的必要技术。关于分布式系统中的缓存。

缓存是至关重要的概念,它最终可以提高整个系统的性能,但是为了从中获得最大的收益,我们可以遵循以下方法在分布式系统中引入缓存。

1.将Web缓存添加为辅助汽车模式:

这种方法非常简单,因为Web缓存容器已与服务器的每个实例一起部署为侧车模式,服务不知道该服务器将其与缓存服务器完全分离,因此我们可以轻松地玩在不影响服务的情况下对缓存容器进行更改或对其进行任何修改。

大型分布式系统中缓存设计的三种策略

但这又有其自身的缺点,因为我们将不得不按与服务相同的规模来扩展缓存服务器,这并不是设计缓存的好方法,因为最佳实践是尽可能少地复制副本,并为它们分配大量资源。例如,每个副本作为一个整体具有两个10 GB的副本,而不是作为一个系统具有1 GB的10个缓存副本,这将是有益的,因为它将降低命中率,这最终将超过系统中缓存的目的,并且为了克服这些缺点,我们可以将缓存用作副本服务,这将在下一节中进行介绍。

2.在系统中将缓存容器添加为副本服务:

无需将缓存实例与容器的每个实例一起添加,我们可以在服务容器上方添加缓存Web服务器,以便所有容器都可以访问这些缓存副本,如下图所示,然后该缓存将调用高速缓存未命中时的服务。

大型分布式系统中缓存设计的三种策略

这种方法的主要优点是,缓存服务器的副本很少,每个副本服务器都具有独立存储数据的巨大能力,因此与以前的策略以及用NodeJS编写的应用程序相比,总体上减少了缓存丢失可以真正利用单核,因为它具有单线程特性,因此可以在这种方法中使用它在单台机器上创建NodeJs服务的多个较小副本,以利用多个核心,并且前面具有这些最少数量的副本并具有最大的资源,从而使其成为可能。更适合在分布式系统中实现的缓存策略,因为使用此方法,我们不必使用应用程序服务扩展缓存服务。

您还可以执行各种操作,例如在高速缓存层侧而不是在应用程序服务中实现速率限制和SSL本身的终止。

但是同样,如果要缓存的请求本身非常庞大,并且RPS(每秒请求数)也很高,那么使用称为“分片缓存”的概念将请求本身分布在整个缓存副本中会更有意义。我们将在下一节中介绍。

3.分片缓存:

先前的方法通常用于构建无状态服务,而分片式缓存用于在有状态服务中构建缓存,如果应用程序一次具有数百万个并发连接,甚至毫秒级的延迟对您来说也可能会造成很大的代价,那么这也是有益的。这生意。

Shraded缓存是位于用户和缓存副本之间的缓存,而缓存又具有在所有副本之间平均分配负载的逻辑。这里重要的是设计分片哈希函数,以避免频繁冲突并保持负载均匀在所有副本中都有许多策略,例如用于实现分片逻辑的一致性哈希 ,这不在本文的讨论范围之内。

大型分布式系统中缓存设计的三种策略

同样,通过缓存的分片,与我们之前讨论的方法相比,我们可以在缓存端本身存储最大的资源,例如,如果我们的服务具有100GB的数据,那么我们只能拥有5个具有容量的缓存服务器副本每个缓存10 GB,以覆盖服务最近使用的数据的50%,这最终提高了缓存的命中率,从而以最少的缓存副本数量提高了整个应用程序的性能。

再次,此分片系统的设计和实现确实是成本,并且也增加了整个系统的复杂性,因为现在我们也必须考虑代理服务器的可靠性和弹性。

在生产中实施这种策略时,我们确实必须小心一些概念,例如可用性,可靠性,弹性和可伸缩性,以便它实际上可以在分布式系统中发挥至关重要的作用,我们将在下一系列文章的后面部分进行介绍。

但是,我们在分布式系统中始终可以遵循的一条黄金法则是始终采用称为“两个错误较高的策略进行设计,这意味着通过在两个级别(而不是一个级别)上处理故障来设计弹性策略,以便在发生任何故障转移时系统应该有一次承担错误的机会,而不是立即失败。

From: https://hackernoon.com/different-strategies-for-designing-the-caching-in-large-scale-distributed-system-fg87307f