【发布时间】:2022-01-16 18:45:55
【问题描述】:
我面临以下问题,我想知道其他人的意见和建议。
我有一个带有以下查询参数的第三方 API: 假设有 10000 个 storeId,调用该 API 将导致 10k 次调用
?storeId=1&status=active
我有自己的服务,它使用从我自己的端点请求的 N 个 storeId 调用此 API。假设我调用我的服务,例如 100 家商店
http://localhost:8080?storeIds=[1,2,3,4,5...] 最多 100
此调用也可能是来自过滤商店的请求:
http://localhost:8080?storeIds=[78,99,104,320,123...] 最多 N
List<Store> stores = new ArrayList<>(storeIds.size());
storeIds.forEach(storeId -> {
Store store = thirdPartyService.call(storeId);
stores.add(store);
});
进行并行调用会导致第三方系统崩溃,因为它无法支持 x 秒那么多的请求。
我无法更改第三方端点以接受 N 个 storeIds
为了解决这个问题,我仍然实现了一个缓存,因为我在我的缓存中存储每个存储 1 一个 1 它也会导致性能问题,因为如果你必须调用缓存 10.000 次。
由于我从我的端点收到的 storeIds 列表并不总是相同的,它可以包含一些在缓存中的 storeIds 而其他一些不是我无法从缓存中检索所有的,所以我必须调用将它们发送到第三方 api。
我想知道是否有另一种观点来解决这个问题,因为将一组 storeIds 存储为缓存并不能解决问题,例如:
第一次调用:storeIds:[1,2,3,4,5,732,2321](我们这里有更多,但我简化了这个)storedSet on cache 第二次调用:[1,2,3,99,102,232,732](我们还有更多)
在第二次调用中,有些元素在缓存中,有些没有,甚至有些没有被请求。先前存储在缓存上的 Set 包含其中一些数据,但也包含一些我不需要的数据,这就是为什么我将数据存储为 1 storeId = 1 缓存上的条目。
非常感谢!
【问题讨论】:
-
我不清楚你在问什么。缓存的键应该是 storeId,因此在上面的示例中,您向第三方服务发出的满足第二次调用的请求将要求 99、102 和 232,并返回 1、2、3 和 732 的缓存版本。
-
大多数 Java 缓存实现,如 Caffeine、cache2k、EHCache 或与 JCache 兼容的缓存都有一个名为
Cache.getAll的批量获取方法。这将满足您的要求。返回缓存中已经存在的条目,并通过配置的CacheLoader为丢失的条目发出加载请求。
标签: java performance caching