为我的微服务实现请求级缓存

时间:2018-06-24 09:47:23

标签: microservices distributed-computing

我正在尝试减少应用程序一遍又一遍地计算相同事​​物的时间...这听起来像是一个缓存用例,但可能需要对体系结构进行更改。

情况是这样的:有许多呼叫者独立地向我的微服务提交几乎相同的请求。这种情况会持续一段时间(与处理其中一个请求所需的时间量级相同),然后它们都移至一组新的几乎完全相同的请求。

在可行的范围内,我只想计算一次唯一请求。

在给定的时间,我将收到几个请求来计算每个

{A, T0}{B, T0}{C, T0}{A, B, T0}{B, C, T0}

然后,我的呼叫者切换到{A, T1}{B, T1}等。

虽然我正在一个节点上计算{A, T0}请求的结果,但是群集将收到针对同一{A, T0}请求的其他几个请求。即使在我完成计算结果之后,但在呼叫者移至T1之前,我仍然会收到{A, T0}请求。

此外,可以将{A, B, T0}请求分解为{A, T0}{B, T0}请求以及简单的联接。

计算单个请求后,应该非常容易地缓存该结果并将其提供给后续请求。只是大多数重复请求是在计算第一个请求时出现的。

是否有任何形式的请求级缓存可以缓解这种情况?

听起来确实有点像试图使POSTs成为幂等,但这可能不可行。

上面的ABC可能的“字母”集是已知的,但是很大。构成请求的“字母”子集可能会稍有变化(例如,某个时刻可能有一个{A, C, D, T2}请求)。

是否有更好的体系结构解决方案? 只是在上面扔更多的硬件就可以了,但看起来很浪费。

编辑:

我正在考虑的一种方法是:

  • “喜欢”请求被路由到同一节点。例如。所有{A, T0}请求都转到节点12
  • 在本地,我在每个节点上都有RequestFuture<Response>的(LRU)缓存
  • 任何请求要么侦听现有的Future,要么注册并执行一个新请求
  • 如果该节点出现故障,那么“ like”请求将全部分配给另一个节点,并且该请求将被再次处理

这变得棘手的地方是处理{A, B, T0}类型的请求。这些请求被分成较小的请求,每个请求都可以由不同的节点处理。

1 个答案:

答案 0 :(得分:0)

要提到的一件事是您的问题太过广泛了。

无论如何,我希望您的整个问题总结一下这两个问题的答案。


(1)缓存响应(针对特定请求计算得出),并针对随后出现的相同请求反复为该响应提供服务(无需重新计算)。

(2)缓存计算出的值(计算出的值是为了满足特定请求),然后重用该值(不进行计算)来满足需要该值作为其计算一部分的后续请求。

您需要在多节点系统中完成该操作。

是的。这两个问题都有答案。


(1) HTTP缓存

因此,您怀疑是否有可能解决多节点环境。实际上,HTTP缓存仅适用于 中级 服务器(负载平衡,CDN等)和浏览器(或移动设备)不是单个节点< / strong>。

仅在请求进入最终服务器节点之前,您就可以配置缓存要求并从缓存(中间节点)返回响应。您可能还需要向应用程序中添加一些代码。

除了简单的响应缓存外,还有许多其他现成的功能。为了进行缓存,您需要为中间服务器使用支持缓存的服务器应用程序(例如nginx)(希望在您的方案中,它是您的负载均衡器)。无论如何,它们大多数都支持默认 GET 请求。但是这里有 根据您选择的产品,还可以做一些工作来支持 POST

并且您还需要配置HTTP缓存头。在SO答案中不可能提及HTTP缓存的所有细节。无论如何,this都是由 Google 发布的有关HTTP缓存的非常好的读物。还有其他网络资源。

(2) 一个缓存数据库

您可以计算一个特定的值并将其存储在缓存db(所有节点可集中访问)中。这样您就可以在执行特定计算之前将缓存查找逻辑添加到代码中。

有许多可以满足您需求的内存缓存数据库应用程序。

例如:redisHazelcast


我希望这能总结您的需求。