关于提高高速缓存重型系统的效率

时间:2019-06-05 08:06:17

标签: java caching responsive-design architecture microservices

我将要提高具有以下属性/体系结构的高速缓存繁重系统的效率:

系统具有2个组件,一个实例后端和多个前端实例,分布在远程数据中心。

后端生成数据并将其写入到关系数据库中,该关系数据库已复制到多个数据中心。

前端通过从数据库中读取数据并提供服务来处理客户端请求(基于常见的网络流量)。数据在过期之前会在本地缓存中存储一​​个小时,并且必须再次进行检索。

(缓存的逐出策略基于LRU)。

我想提到上面的实现有两个问题:

事实证明,许多数据库访问是冗余的,因为基础数据实际上并未更改。 另一方面,直到缓存TTL过去,更改才会反映出来,从而导致陈旧性问题。

您能提出解决这两个问题的解决方案吗?

如果数据存储在像cassandra这样的nosql数据库中而不是经典数据库中,解决方案应该改变吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,这里没有银弹。有两种明显的变体:

  1. 保留长的TTL或永久的高速缓存,但是在更新高速缓存数据时会使它们无效。这可能会变得非常复杂且容易出错
  2. 只需降低TTL即可获得更快的更新。低TTL方法是恕我直言,KISS方法。我们走低至27秒。具有低TTL的缓存在正常操作期间不会有很多命中,但是在闪存人群击中您的应用程序时会很有帮助

如果您的数据库足够强大并且具有可接受的延迟,则方法2是最简单的方法。

如果您的数据库没有可接受的延迟,或者您的应用程序正在针对每个Web请求对数据库进行多次顺序读取,则可以使用提供提前刷新或后台刷新的缓存。这意味着,高速缓存会自动刷新条目,并且除了第一次读取外没有其他延迟。但是,这种方法具有增加数据库负载的缺点。

Cassandra可能不支持经典数据库那样的访问策略。更改为Cassandara也会影响您的缓存,例如如果您还缓存查询结果。但是,高级概念保持不变。您的数据访问层可能会更改为异步或响应模式,因为Cassandara支持该模式。

如果要执行失效(解决方案1),请使用Cassandara从数据库中获取已更新数据的信息,请参见CASSANDRA-8844。您可能会从“经典” SQL数据库中获得类似的信息,但这是特定于供应商的功能。