
我正在更新一个现有的tomcat应用程序,以从REST中读取某些资源。目前,应用程序从平面文件中读取它们。由于应用程序非常关键,所以我添加了一个缓存层,以便REST返回的对象总是可用的。
在API客户端的服务层中,如果在缓存中找不到请求项,则将请求发送到实际的API中,将响应放入MapDB缓存并返回给调用方。启动监听器调用一堆具有不同参数的API,以便所有数据都在MapDB缓存中。我不对缓存中的项设置过期,因为我希望它们始终可用,除非我按需刷新。
问题是Web和API客户端是不同的项目。由于API客户端决定从Cache或API读取,所以我无法强制从应用程序中刷新缓存值。
最后一个"true“参数指示强制刷新缓存。
有什么更干净的方法可以做到这一点?我觉得向函数中添加有关缓存的参数会使它变得笨拙,并添加依赖项--比如getUsers(String country, boolean forceAPIrequest)。但是删除和添加相同的条目也会浪费资源和堆空间,从而导致GC时间的推移。此外,App将直接访问客户端缓存来执行这些操作。
所有这些都是基于强烈的假设,即REST是不可靠的。Web应用程序不应该有任何停机时间。
发布于 2015-09-16 11:36:40
如果我正确理解,缓存的位置主要是为了在REST服务不可用的情况下的可实现性,而不是为了性能。
在这种情况下,每次收到客户端的请求时都可以调用REST服务,如果得到响应(REST服务正在工作),则更新MapDB缓存并将响应返回给API。如果REST服务关闭,并且没有得到响应,只需从MapDB返回缓存的值即可。
这样,您的客户总是得到尽可能最新的可能版本,同时保持可靠性要求。
您可以在对客户端的响应中包含一个标志,指示响应是来自缓存还是最新响应。对于绝对需要最新响应的客户端来说,这可能是有用的,因为与处理旧数据相比,失败更可取。
发布于 2015-09-17 13:39:15
向API客户端refreshCache(...)添加一个方法,该方法将刷新整个缓存,类似于通过启动侦听器所做的操作。如果使用API客户端的缓存感知应用程序在请求特定数据之前知道需要刷新数据,那么首先让它调用refreshCache。
发布于 2015-09-15 18:25:30
您先做的调用S完成缓存刷新是吗?如果那样的话,为什么不安排一下呢。如果完整的请求返回良好,那么刷新并重新实例化缓存..。
https://softwareengineering.stackexchange.com/questions/297338
复制相似问题