我不知道如何在标题中更好地解释我的挑战。
目前的设置是,我使用Spring Rest Service作为“中间件层”,以便以一种更“友好”的方式转换后端的数据,这是一个巨大的响应。
例如,后端的结构如下:
public class Customer
{
private String id;
private String bankAccount;
private String customerName;
}中间件当前正在redis中缓存来自后端的响应。它还具有以下端点:
public class ServiceController
{
getBankAccountById(String id);
getCustomerNameById(String id);
getCustomerObjectById(String id);
}所有请求都会为customer对象生成一个后端调用,如果还没有对象,则将其缓存到redis中。
但在多线程环境中,特别是在“云”/多实例环境中,如果使用者正在以并行方式进行n个请求(#1 getBankAccountById() #2 getCustomerNameById()等-完全相同的毫秒),那么只有一个请求是针对“真正的”后端发出的吗?
我的目标类似于在redis中放置一个标记,在不久的将来,在缓存中将有一个给定id的customer类型的对象,这会导致阻塞其他实例的所有其他线程/线程,以减少后端调用。
我的问题是,有没有一个简单的或者可能是开箱即用的解决方案?
我唯一找到的是Spring Boot和@Cacheable的文档,这是不可行的,因为它在同一应用程序中同步对给定Id的调用,而不是集群环境中的服务范围。
除此之外,后端非常慢(每次调用5-10秒),因为@Cacheable注释已经传递了,因为它在返回实际的@Cachable对象时开始写入缓存。
提前谢谢,干杯,亚历克斯
//编辑:我的意思是@Cachable(sync=true)只影响实例级别,而不是分布式级别。因此,从我的理解来看,这在这里是没有意义的。
发布于 2020-02-06 14:14:58
您可以尝试@Cacheable(sync = true),它可以确保只有一个线程在构建缓存,所有其他线程都可以访问缓存,而不是进行后端调用。
https://stackoverflow.com/questions/60082642
复制相似问题