【发布时间】:2016-09-28 00:18:23
【问题描述】:
我们有一种情况,我们在 API 上调用一个相当昂贵的函数。让我们称之为API.ExpensiveCall()
这个ExpensiveCall() 在Web 应用程序中经常被调用。虽然对于一个用户来说并不明显,但当您同时有 5 个左右的用户时,它就会变得很明显。
我们想要缓存这些结果。但是由于API.ExpensiveCall() 对我们来说本质上是一个黑盒子,所以我们无法使缓存失效,也无法知道何时刷新。
所以我们建议的解决方案是创建一个 Windows 服务,它会简单地每十秒调用一次 API.ExpensiveCall(),然后将结果保存到 Web 应用程序已经在使用的本地数据库中。
这样,无论网站上有 1 个用户还是 20 多个用户,ExpensiveCall() 只会每 10 秒调用一次。在API.ExpensiveCall() 所连接的外部系统上,这是一个非常受控的负载。
问题
我们的项目经理不同意这一点。出于某种原因,他认为每 10 秒定时刷新是一个坏主意,因为在他看来会给外部系统带来过多的负载。
但是,如果我们不采取任何措施,并且在没有任何缓存的情况下保持原样,它不仅会降低 Web 应用程序的性能,而且肯定会导致每秒超过一次 ExpensiveCall在外部系统上。这个数字会随着 Web 应用程序上的用户数量而增加。
我想问你这种缓存方式真的是个坏主意吗?您是否听说过其他系统使用这种方法进行缓存?如果这是一个坏主意,当系统对您来说是一个黑盒子时,是否还有其他更好的方法来缓存系统结果?
编辑:
您的回复似乎表明我应该使用 ASP.Net 的内存缓存机制的超时功能。
我喜欢超时的想法。我现在看到的唯一(小)问题是,当超时到期并且是时候调用 ExpensiveCall() 时,这将是一个阻塞调用。与查询本地表相反,本地表通过在单独的进程中不断刷新来保持最新。这是我觉得投票想法很有吸引力的地方。虽然我必须承认每 10 秒轮询一次确实感觉很奇怪,这就是我对它持谨慎态度的原因。
【问题讨论】: