我正在尝试减少应用程序一遍又一遍地计算相同事物的时间...这听起来像是一个缓存用例,但可能需要对体系结构进行更改。
情况是这样的:有许多呼叫者独立地向我的微服务提交几乎相同的请求。这种情况会持续一段时间(与处理其中一个请求所需的时间量级相同),然后它们都移至一组新的几乎完全相同的请求。
在可行的范围内,我只想计算一次唯一请求。
在给定的时间,我将收到几个请求来计算每个
{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成为幂等,但这可能不可行。
上面的A
,B
和C
可能的“字母”集是已知的,但是很大。构成请求的“字母”子集可能会稍有变化(例如,某个时刻可能有一个{A, C, D, T2}
请求)。
是否有更好的体系结构解决方案? 只是在上面扔更多的硬件就可以了,但看起来很浪费。
编辑:
我正在考虑的一种方法是:
{A, T0}
请求都转到节点12 Request
至Future<Response>
的(LRU)缓存Future
,要么注册并执行一个新请求这变得棘手的地方是处理{A, B, T0}
类型的请求。这些请求被分成较小的请求,每个请求都可以由不同的节点处理。
答案 0 :(得分:0)
要提到的一件事是您的问题太过广泛了。
无论如何,我希望您的整个问题总结一下这两个问题的答案。
(1)缓存响应(针对特定请求计算得出),并针对随后出现的相同请求反复为该响应提供服务(无需重新计算)。
(2)缓存计算出的值(计算出的值是为了满足特定请求),然后重用该值(不进行计算)来满足需要该值作为其计算一部分的后续请求。
您需要在多节点系统中完成该操作。
是的。这两个问题都有答案。
(1) HTTP缓存
因此,您怀疑是否有可能解决多节点环境。实际上,HTTP缓存仅适用于 中级 服务器(负载平衡,CDN等)和浏览器(或移动设备)不是单个节点< / strong>。
仅在请求进入最终服务器节点之前,您就可以配置缓存要求并从缓存(中间节点)返回响应。您可能还需要向应用程序中添加一些代码。
除了简单的响应缓存外,还有许多其他现成的功能。为了进行缓存,您需要为中间服务器使用支持缓存的服务器应用程序(例如nginx)(希望在您的方案中,它是您的负载均衡器)。无论如何,它们大多数都支持默认的 GET 请求。但是这里有 根据您选择的产品,还可以做一些工作来支持 POST 。
并且您还需要配置HTTP缓存头。在SO答案中不可能提及HTTP缓存的所有细节。无论如何,this都是由 Google 发布的有关HTTP缓存的非常好的读物。还有其他网络资源。
(2) 一个缓存数据库
您可以计算一个特定的值并将其存储在缓存db(所有节点可集中访问)中。这样您就可以在执行特定计算之前将缓存查找逻辑添加到代码中。
有许多可以满足您需求的内存缓存数据库应用程序。
我希望这能总结您的需求。