一致性Hash和有權重的輪詢是較爲複雜的。不只sofa-rpc中有,dubbo中也有,不過dubbo中實現的更復雜。算法
一致性Hash的目的與輪詢是不同的:一致性Hash指望一樣的參數,則調用同一個服務提供者,即便在服務提供者們有變更(某些服務提供者掛了或者是動態的新增了服務提供者)的狀況,波動也很小,因此實現時要考慮虛擬節點;輪詢是循環調用服務提供者。ide
圖1 sofa-rpc中的一致性Hash實現類ConsistentHashLoadBalancer的類繼承圖繼承
說明:sofa-rpc中ConsistentHashLocadBalancer的doSelect(SofaRequest,List<ProviderInfo>)是算法實現的關鍵rpc
圖2 Dubbo中一致性Hash實現類ConsistentHashLoadBalancer的類繼承圖io
說明:Dubbo中ConsistentHashLoadBalance的doSelect(List<Invoker<T>>,URL,Invocation)是算法實現的核心List