我面臨以下問題,我想知道其他人的意見和建議。
我有一個帶有以下查詢引數的第三方 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,4,5,732,2321](我們還有更多)
在第二次呼叫中,有些元素在快取中,有些元素不在,甚至有些元素沒有被請求。先前存盤在快取中的 Set 包含其中一些的資料,但也包含一些我不需要的資料,這就是為什么我將資料存盤為 1 storeId = 1 個條目在快取中。
太感謝了!
uj5u.com熱心網友回復:
許多快取實作提供了一種所謂的批量獲取方法:Cache.getAll. 這就是你想要的伎倆。這是一個基于cache2k的解決方案草圖。快取設定是:
Cache<Integer, Store> cache =
new Cache2kBuilder<Integer, Store>() {}
.loader(id -> {
// http call to get Store data for given id
return new Store();
})
.loaderThreadCount(4) // numbers of parallel loads
.build();
然后你可以像這樣檢索資料:
// request some data, everything will be retrieved via the loader
Map<Integer, Store> result = cache.getAll(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
// ids 4 and 5 will be taken from the cache, the others are loaded
Map<Integer, Store> result2 = cache.getAll(Arrays.asList(4, 5,10, 12, 17));
這將向您的資料源發出最多 4 個并行加載請求。異步變體也可用。
該解決方案與其他快取類似,如 Caffeine、EHCache 或任何 JCache 兼容快取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/380853.html
