第192章 ZooKeeper
ZooKeeper リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.9 以降で利用可能
ZooKeeper コンポーネントは、ZooKeeper クラスターとの対話を許可し、以下の機能を Camel に公開します。
- ZooKeeper 作成モードのいずれかのノードの作成。
- 任意のクラスターノードのデータコンテンツを取得および設定します(設定されるデータは
byte[]に変換する必要があります)。 - 特定のノードに割り当てられている子ノードの一覧を作成して取得します。
- ZooKeeper によって調整された Leader 選択を利用して、エクスチェンジを処理する必要があるかどうかを判断する Distributed RoutePolicy。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-zookeeper</artifactId>
<version>2.17.0.redhat-630xxx</version>
<!-- use the same version as your Camel core version -->
</dependency>
Camel on EAP デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
zookeeper://zookeeper-server[:port][/path][?options]
uri のパスは、エンドポイントのターゲットとなる ZooKeeper サーバー(別名 znode)のノードを指定します。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
path
|
ZooKeeper サーバー(別名 znode)のノード | |
listChildren
|
false
|
ノードの子をリストすべきかどうか。 |
repeat
|
false
|
znode への変更は監視され、繰り返し処理される必要があります。 |
backoff
|
5000
|
再試行する前にエラーをバックオフする間隔。 |
timeout
|
5000
|
タイムアウトする前に接続を待機する時間間隔。 |
create
|
false
|
まだ存在していない場合は、エンドポイントがノードを作成するはずです。 |
createMode
|
EPHEMERAL
|
新規に作成されたノードに使用する create モード(以下を参照)。 |
sendEmptyMessageOnDelete
|
true
|
Camel 2.10: znode の削除で、空のメッセージがコンシューマーに送信される必要がある |
ユースケース リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
znode からの読み取り。 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のスニペットは、すでに存在している場合に znode '/somepath/somenode/' からデータを読み取ります。取得したデータはエクスチェンジに置かれ、残りのルートに渡されます。
from("zookeeper://localhost:39913/somepath/somenode").to("mock:result");
ノードが存在しない場合は、エンドポイントの作成を待たせるフラグを指定できます。
from("zookeeper://localhost:39913/somepath/somenode?awaitCreation=true").to("mock:result");
znode からの読み取り -(追加の Camel 2.10 以降) リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ZooKeeper アンサンブルから受信された WatchedEvent によりデータが読み取られると、CamelZookeeperEventType ヘッダーはその WatchedEvent からの ZooKeeper の EventType 値を保持します。データが最初に読み取られる場合(WatchedEvent によってトリガーされない)、CamelZookeeperEventType ヘッダーは設定されません。
znode への書き込み。 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のスニペットは、エクスチェンジのペイロードを '/somepath/somenode/' にすでに存在している場合に znode に書き込みます。
from("direct:write-to-znode").to("zookeeper://localhost:39913/somepath/somenode");
エンドポイントを使用すると、ターゲットの znode をメッセージヘッダーとして動的に指定することができます。文字列
CamelZooKeeperNode でキーのヘッダーが存在する場合、ヘッダーの値はサーバー上の znode へのパスとして使用されます。たとえば、上記の同じルート定義を使用する場合、以下のコードスニペットは /somepath/somenode ではなく、ヘッダー /somepath/someothernode からパスに書き込みます。ZooKeeper に保存されているデータはバイトベースであるため、testPayload は byte[] に変換する必要があります。
Object testPayload = ...
template.sendBodyAndHeader("direct:write-to-znode", testPayload, "CamelZooKeeperNode", "/somepath/someothernode");
ノードが存在しない場合にも作成するには、'create' オプションを使用する必要があります。
from("direct:create-and-write-to-znode").to("zookeeper://localhost:39913/somepath/somenode?create=true");
バージョン 2.11 以降では、'DELETE' に設定してヘッダー 'CamelZookeeperOperation' を使用してノードを 削除 することもできます。
from("direct:delete-znode").setHeader(ZooKeeperMessage.ZOOKEEPER_OPERATION, constant("DELETE")).to("zookeeper://localhost:39913/somepath/somenode");
または同等に
<route>
<from uri="direct:delete-znode" />
<setHeader headerName="CamelZookeeperOperation">
<constant>DELETE</constant>
</setHeader>
<to uri="zookeeper://localhost:39913/somepath/somenode" />
</route>
ZooKeeper ノードは異なるタイプを持つことができます。これらは 'Ephemeral' または 'Persistent' および 'Sequenced' または 'Unsequenced' にすることができます。各タイプの詳細は、を参照して ください。デフォルトでは、エンドポイントは、配列されていない一時ノードを作成しますが、タイプは uri 設定パラメーターまたは特別なメッセージヘッダーを介して簡単に操作できます。create モードに想定される値は、CreateMode 列挙から簡単に名前です。
PERSISTENTPERSISTENT_SEQUENTIALEPHEMERALEPHEMERAL_SEQUENTIAL
たとえば、URI 設定を介して永続的な znode を作成するには、以下を実行します。
from("direct:create-and-write-to-persistent-znode").to("zookeeper://localhost:39913/somepath/somenode?create=true&createMode=PERSISTENT");
または、ヘッダー
CamelZookeeperCreateMode を使用します。ZooKeeper に保存されているデータはバイトベースであるため、testPayload は byte[] に変換する必要があります。
Object testPayload = ...
template.sendBodyAndHeader("direct:create-and-write-to-persistent-znode", testPayload, "CamelZooKeeperCreateMode", "PERSISTENT");
ZooKeeper が有効な Route ポリシー。 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ZooKeeper では、追加設定なしで非常にシンプルで効果的なリーダーの選択が可能になります。このコンポーネントは、RoutePolicy でこの選択機能を悪用し、ルートが有効であるタイミングと方法を制御します。このポリシーは通常、フェイルオーバーのシナリオで使用され、Camel ベースのサーバーのクラスター全体でルートの同一インスタンスを制御します。非常に一般的なシナリオは、クラスター全体で分散されるルートのインスタンスが複数あり、そのうちの 1 つのインスタンスのみが一度に実行される必要がある単純な Master-Slave 設定です。マスターが失敗した場合は、利用可能なスレーブから新規マスターを選択し、この新規マスターのルートを起動する必要があります。
このポリシーは、選出に関与する RoutePolicy のすべてのインスタンスで共通の znode パスを使用します。各ポリシーはこの ID をこのノードに書き込みます。zookeeper は書き込みを受信順に順序付けます。次に、ポリシーはノードの一覧を読み取り、その ID の投稿を確認します。この投稿は、ルートを開始する必要があるかどうかを判断するために使用されます。ポリシーは、クラスター全体で起動する必要があるルートインスタンスの数で起動時に設定され、リスト内の位置がこの値よりも小さい場合、そのルートが起動します。マスター/スレーブのシナリオでは、ルートはルートインスタンス 1 つで設定され、一覧の最初のエントリーのみがルートを起動します。すべてのポリシーは、リストへの更新を監視し、リストによってルートが開始される必要がある場合に再度計算されるかどうかを監視します。Zookeeper の Leader 選択機能の詳細は、このページ を参照してください。
以下の例では、選択にノード /someapplication/somepolicy を使用し、ノード一覧で上位 1 エントリーのみを起動するように設定されます。つまり、マスターを選択します。
ZooKeeperRoutePolicy policy = new ZooKeeperRoutePolicy("zookeeper:localhost:39913/someapp/somepolicy", 1);
from("direct:policy-controlled").routePolicy(policy).to("mock:controlled");