先介紹一下我所在的團隊使用Fallback的使用方式
- FallBack的返回內容是null或者一個空集合,如下代碼所示
public class ProductClientFallBack implements SdbProductClient {
@Override
public List<ProductVO> queryAllProducts() {
return Lists.newArrayList();
}
@Override
public ProductVO getProductById(int productId) {
return null;
}
}
- Fallback文件由服務方提供
- 針對現行的使用方式我產生了兩個疑問/問題
FallBack方法中直接返回null或者空集合這樣真的好嗎?
- 直接返回null或者空集合會導致調用方無法區分null和空集合是來源於正常的業務邏輯還是發生了降級,這樣使用很容易造成問題的難以追蹤
- 那么如何解決這個問題呢,可以參考以下代碼,方法返回一個包裝的Response或者特殊的Exception
@Override
public Response<Integer> uploadProductJob(List<ProductJob> productJobList) {
return ResponseUtil.makeError(ErrorCode.CLIENT_SERVER_ERROR);
}
FallBack 應該由服務方提供,還是在調用方來提供
第一種情況,大部分接口都有降級邏輯,並且多個調用方使用同一套降級邏輯;這種情況下FallBack由服務方提供,這樣可以省去調用方之間出現復制代碼的情況,但是這樣存在一個很嚴重的問題,就是復雜的降級邏輯會引用到其他包,可能會引發相互依賴的問題,所以這種情況下是放在服務方還是調用方還需要靈活的做一下決策
第二種情況,大部分接口都有降級邏輯,並且多個調用方使用不同的降級邏輯;這種情況下FallBack文件放在調用方,由於調用方使用的是不同的降級邏輯,那么服務方就無法提供個性化的降級方案了
第三種情況,大部分接口都沒有降級邏輯;這種情況下FallBack文件由服務方提供即可,如個別接口需要有降級邏輯,在調用方實現降級邏輯即可;其中FallBack方法的返回內容,直接返回一個特殊的Exception或者特殊的Response;據我了解大部分技術團隊都是這樣用的,這樣用起來簡單、方便、直接一些