『壹』 bbo使用zookeeper連接,zookeeper宕機後怎麼處理
1,配置文件同步2,主從切換3,分布式隊列4,分布式鎖5,其他在以前的文章裡面有寫過使用zookeeper原生的api,監聽zk節點變化,那麼本篇我們就來看下,如何使用curator來完成監聽,代碼如下:packagecomqincuratorzk;importjavaxsoundmidibbo使用zookeeper連接,zookeeper宕機後怎麼處理
『貳』 bbo服務端注冊到zookeeper是長連接嗎
是的。
Dubbo協議:採用NIO復用單一長連接,並使用線程池並發處理請求,減少握手和加大並發效率,在大文件傳輸時,單一連接會成為瓶頸
『叄』 bbo 怎麼決定連接zookeeper集群
bbo可以有多中發布模式,廣播、redis、zookeeper等形式,如果確定使用使用zookeeper做注冊中心,做如下配置即可:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:bbo="http://code.alibabatech.com/schema/bbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/bbo
http://code.alibabatech.com/schema/bbo/bbo.xsd">
<!--bbo應用此處根據服務端和消費端自行配置-->
<bbo:applicationname="${bbo.application.name}"owner="${bbo.owner}"organization="${bbo.organization}"/>
<!--bbo注冊中心此處服務端和消費端相同配置即可-->
<bbo:registryid="zookeeperRegistry"protocol="zookeeper"address="172.21.108.111:2181"timeout="${registry.timeout}"/>
<!--bbo服務使用的協議-->
<bbo:protocolname="bbo"port="${bbo.port}"/>
<!--bbo服務提供者先關配置參數protocol設置使用的協議消費端無效-->
<bbo:providerdelay="-1"protocol="zookeeper"timeout="${bbo.timeout}"retries="3"></bbo:provider>
<!--bbo服務發布-->
<bbo:serviceinterface="com.xxx.queues.sdk.service.QueueMessageService"
ref="queueMessageService"
owner="${bbo.owner}"
version="${bbo.version}"
protocol="${bbo.protocol}"
registry="zookeeperRegistry"此處配置和bbo:registryid相同
delay="-1"/>
</beans>
『肆』 生產者啟動成功了,為什麼zk里沒有bbo這個目錄
現在一般能打開64個。 文件描述符的范圍是0 ~ O P E N _ M A X 。早期的U N I X版本採用的上限值是1 9 (允許每個進程打開2 0個文件),現在很多系統則將其增加至6 3。
『伍』 bbo使用zookeeper連接,zookeeper宕機後怎麼處理
zookeeper宕機後,因為消費者會緩存提供者的信息,所以應用不會有問題。但是,此時提供者和消費者都無法重連zookeeper,因為bbo貌似配置的zkclient不會重連zookeeper,所以一旦重啟一台服務提供者,那麼這台就從服務消費者的緩存中消失了,此時服務消費者又連不上zookeeper,所以如果同時重啟,消費者就沒有提供者可用了,所以只能重啟一台提供者後,再重啟一個消費者,交錯重啟。
『陸』 為什麼bbo使用zkclient作為zookeeper的客戶端
本文內容並非原創,使用資料均來自互聯網。
bbo使用了zkClient而不是使用zookeeper本身的客戶端與zookeeper進行交互,為什麼呢?
先看看zookeeper本身自帶的客戶端的問題。
1 ) ZooKeeper的Watcher是一次性的,用過了需要再注冊;
2 )
session的超時後沒有自動重連,生產環境中如果網路出現不穩定情況,那麼這種情況出現的更加明顯;
3
)
沒有領導選舉機制,集群情況下可能需要實現stand by,一個服務掛了,另一個需要接替的效果;
4
) 客戶端只提供了存儲byte數組的介面,而項目中一般都會使用對象。
5 )客戶端介面需要處理的異常太多,並且通常,我們也不知道如何處理這些異常。
I0Itec這個zookeeper客戶端基本上解決了上面的所有問題,主要有以下特性:
1) 提供了zookeeper重連的特性------能夠在斷鏈的時候,重新建立連接,無論session失效與否.
2) 持久的event監聽器機制------ ZKClient框架將事件重新定義分為了stateChanged、znodeChanged、dataChanged三種情況,用戶可以注冊這三種情況下的監聽器(znodeChanged和dataChanged和路徑有關),而不是注冊Watcher。
3) zookeeper異常處理-------zookeeper中繁多的Exception,以及每個Exception所需要關注的事情各有不同,I0Itec簡單的做了封裝.
4) data序列化------簡單的data序列化.(Serialzer/Deserialzer)
5)有默認的領導選舉機制
請注意使用I0Itect-zkClient暫時有幾個方法仍需要重寫:
1) create方法 : 創建節點時,如果節點已經存在,仍然拋出NodeExistException,可是我期望它不在拋出此異常.
2) retryUtilConnected : 如果向zookeeper請求數據時(create,delete,setData等),此時鏈接不可用,那麼調用者將會被阻塞直到鏈接建立成功;不過我仍然需要一些方法是非阻塞的,如果鏈接不可用,則拋出異常,或者直接返回.
3) create方法 : 創建節點時,如果節點的父節點不存在,我期望同時也要創建父節點,而不是拋出異常.
4) data監測: 我需要提供一個額外的功能來補充watch的不足,開啟一個線程,間歇性的去zk server獲取指定的path的data,並緩存起來..歸因與watch可能丟失,以及它不能持續的反應znode數據的每一次變化,所以只能手動去同步獲取。