轉(zhuǎn)載 記錄
zk在用于服務(wù)發(fā)現(xiàn)的問題
zk將數(shù)據(jù)一致性作為自己設(shè)計的首要目標(biāo),從而不保證服務(wù)的可用性,因為當(dāng)節(jié)點crash后笋庄,需要
進(jìn)行l(wèi)eader的選舉,在這個期間內(nèi)倔监,zk服務(wù)是不可用的直砂。
對于服務(wù)的注冊發(fā)現(xiàn)來說,對數(shù)據(jù)一致性并沒有很大的需求浩习,因為就算獲取到不可用的服務(wù)静暂,也會返回相應(yīng)的
錯誤response,但是如果從注冊中心中獲取不到服務(wù)谱秽,就會是一個很大的問題洽蛀。zk的leader選舉時間有非常長摹迷,
所以用于服務(wù)發(fā)現(xiàn),不是一個很好選擇
eureka的思考
eureka是按照AP的設(shè)計目標(biāo)去實現(xiàn)的郊供,當(dāng)節(jié)點宕機(jī)后峡碉,并不會影響服務(wù)的獲取和注冊,client會從別的節(jié)點中獲取服務(wù)信息驮审,
同時當(dāng)eureka的服務(wù)端發(fā)現(xiàn)85%以上的服務(wù)都沒有心跳的話鲫寄,它就會認(rèn)為自己的網(wǎng)絡(luò)出了問題,就不會從服務(wù)列表中刪除這些失去心跳的服務(wù)疯淫,同時eureka的客戶端也會緩存服務(wù)信息塔拳。eureka對于服務(wù)注冊發(fā)現(xiàn)來說是非常好的選擇。
但是在這段保護(hù)期間內(nèi)實例出現(xiàn)問題峡竣,則客戶端很容易拿到已經(jīng)不存在的服務(wù)實例靠抑,會出現(xiàn)調(diào)用失敗的情況。
針對這種情況适掰,客戶端必須要有容錯機(jī)制颂碧,比如可以使用請求重試、斷路器機(jī)制类浪,
eureka的自我保護(hù)機(jī)制
eureka.server.enable-self-preservation=false 關(guān)閉保護(hù)機(jī)制载城,確保注冊中心可以將不可用的實例正確剔除。
多個服務(wù)中心中费就,一個服務(wù)中心從另一個服務(wù)中心獲取所有的實例诉瓦,然后判斷實例是否已經(jīng)注冊。