7. l org.apache.camel.Mainで起動するCamelアプリケーションの例(*):
ConsulRoutePolicy
2020
7
public void boot() throws Exception {
ConsulRoutePolicy routePolicy = new ConsulRoutePolicy();
routePolicy.setServiceName("myLock");
routePolicy.setTtl(5);
main = new Main();
main.bind("myPolicy", routePolicy);
main.addRouteBuilder(new FileConsumerRoute("Bar", 100));
main.run();
}
RoutePolicyのセットアップ
(クラスタメンバーが同じ設定に
する)
RoutePolicyを
CamelContextに⼊れる
* ソース: camelinaction2/chapter17/cluster-file-consul
Camel Routeを
CamelContextに⼊れる
$ docker run -it --rm -p 8500:8500 consul 予め、consulを起動しておく
from("file:target/inbox?delete=true")
.routePolicyRef("myPolicy")
.log(name + " - Received file: ${file:name}");
l Camel Routeの実装例(HazelcastRoutePolicyと同様):
RoutePolicyを指定する
8. l Infinispanは、Red Hat社が開発した分散キャッシュおよびNoSQLキー/バリューデータストアです。
l InfinispanRoutePolicy(*)は、LockによりConsumerの起動・停⽌を制御することで、1つのRoute
だけ実⾏できるのクラスタリング機能を実現します。
l Lockの実装は、org.infinispan.Cacheのリスナーを利⽤します。
l InfinispanRoutePolicyは、 camel-infinispanにて提供されています。
InfinispanRoutePolicy
2020
8
Camel
Route1
Consumer
ConsulRoutePolicy
* https://github.com/apache/camel/blob/master/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/policy/InfinispanRoutePolicy.java
1
Lock取得
2
Consumer起動
Process Process
Camel
Route1
Consumer
ConsulRoutePolicy
4
Consumer停⽌
Process Process
3 Lock取得できない
Lock
Infinispan
9. l org.apache.camel.Mainで起動するCamelアプリケーションの例(*):
InfinispanRoutePolicy
2020
9
public void boot() throws Exception {
Properties props = new Properties();
props.setProperty("infinispan.client.hotrod.server_list",
"localhost:11222;localhost:11372");
props.setProperty("infinispan.client.hotrod.force_return_values", "true");
// create remote infinispan cache manager and start it
RemoteCacheManager remote = new RemoteCacheManager(
new ConfigurationBuilder().withProperties(props).build(),
true
);
InfinispanConfiguration ic = new InfinispanConfiguration();
ic.setCacheContainer(remote);
…次ページへ
* ソース: camelinaction2/chapter17/cluster-file-infinispan
リモートのInfinispanサーバへ
接続するためのセットアップ
$ ./bin/domain.sh
予め、Infinispanを起動して、"myLock"というキャッシュ
を作成しておく
10. InfinispanRoutePolicy
2020
10
…続き
InfinispanRoutePolicy routePolicy = new InfinispanRoutePolicy(ic);
routePolicy.setLockMapName("myLock");
routePolicy.setLockKey("myLockKey");
// the lock value identifies the node
routePolicy.setLockValue("foo");
main = new Main();
main.bind("myPolicy", routePolicy);
main.addRouteBuilder(new FileConsumerRoute("Foo", 100));
main.run();
}
RoutePolicyのセットアップ
(クラスタメンバーが同じ設定に
する)
RoutePolicyを
CamelContextに⼊れる
Camel Routeを
CamelContextに⼊れる
* ソース: camelinaction2/chapter17/cluster-file-infinispan
from("file:target/inbox?delete=true")
.routePolicyRef("myPolicy")
.log(name + " - Received file: ${file:name}");
l Camel Routeの実装例 (HazelcastRoutePolicyと同様):
RoutePolicyを指定する
11. l Zookeeperは、設定情報の集中管理や名前付けなどのサービスを提供するソフトウェアです。
l MasterRoutePolicy(*)は、LockによりConsumerの起動・停⽌を制御することで、1つのRouteだけ
実⾏できるのクラスタリング機能を実現します。
l Lockの実装は、Zookeeperのznodeのステートを更新することで分散型排他ロックを実現します。
l MasterRoutePolicyは、 camel-zookeeper-masterにて提供されています。
MasterRoutePolicy(Zookeeper)
2020
11
Camel
Route1
Consumer
ConsulRoutePolicy
* https://github.com/apache/camel/blob/master/components/camel-zookeeper-master/src/main/java/org/apache/camel/component/zookeepermaster/policy/MasterRoutePolicy.java
1
Lock取得
2
Consumer起動
Process Process
Camel
Route1
Consumer
ConsulRoutePolicy
4
Consumer停⽌
Process Process
3 Lock取得できない
Lock
Zookeeper
12. l org.apache.camel.Mainで起動するCamelアプリケーションの例(*):
MasterRoutePolicy(Zookeeper)
2020
12
public void boot() throws Exception {
main = new Main();
MasterRoutePolicy master = new MasterRoutePolicy();
master.setZooKeeperUrl("localhost:2181");
master.setGroupName("myGroup");
main.bind("myPolicy", master);
main.addRouteBuilder(new FileConsumerRoute("Bar", 200));
main.run();
}
RoutePolicyのセットアップ
(クラスタメンバーが同じ設定に
する)
RoutePolicyを
CamelContextに⼊れる
Camel Routeを
CamelContextに⼊れる
$ docker run -it --rm -p 2181:2181 -d zookeeper 予め、Zookeeperを起動しておく
* ソース: camelinaction2/chapter17/cluster-zookeeper-master-routepolicy
from("file:target/inbox?delete=true").noAutoStartup()
.routePolicyRef("myPolicy")
.log(name + " - Received file: ${file:name}");
l Camel Routeの実装例:
RoutePolicyを指定する
注意: ⾃動起動を無効にする
13. l 冗⻑化したJMS Broker(例ActiveMQ)へ接続時は、Client Failover機能を使⽤します。
l ActiveMQの場合、BrokerUriにFailoverプロトコルを指定できます。
JMS
2020
13
Camel
Route1
JMS Consumer Process Process
ActiveMQ(Active)
キュー
共有ストア
ActiveMQ(Standby)
キュー
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- configure to use failover between the two brokers -->
<property name="brokerURL" value="failover:tcp://server1:61616,tcp://server2:61616"/>
</bean>
JMS Producer
14. l Kafka Consumerの接続するBroker/Partitionは、Kafkaによって決定されます。
l 1つのPartitionに1つのKafka Consumerをアサイン(Active系)
l PartitionにアサインできないKafka Consumerがアイドル状態(Passive系)
Kafka
2020
14
Kafka Consumer Process Process Producer
Kafka Broker(Active)
1 Partition1接続取得
Topic
4
<bean id="kafka" class="org.apache.camel.component.kafka.KafkaComponent">
<property name="brokers" value="kafka1:9092,kafka2:9092,kafka3:9092"/>
</bean>
Kafka Broker(Active)
Partition2
Kafka Broker(Active)
Partition3
注意: Kafka Consumerの処理済みメッセージはOffsetで管理されます。
l デフォルトではOffsetは5秒間隔⼀度Commitのため、処理中ダウンの場合メッセージ重複が発⽣します。
l マニュアルCommit、或いはIdempodentConsumerを使⽤して重複を抑⽌できます。
Kafka Consumer Process Process Producer
Kafka Consumer Process Process Producer
Kafka Consumer Process Process Producer
アイドル状態
2 Partition2接続取得
3 Partition3接続取得
Partition1
15. l 複数CamelがStateを共有したい場合、共有キャッシュが必要となります。
l 共有キャッシュは、Hazelcast, Infinispan, Redisを⽤いて実現します。
Cache
2020
15
Camel
Route1
Consumer Process Process Producer
Camel
Route2
Consumer Process Process Producer
共有キャッシュ
Hazelcast, Infinispan, Redisなど
Read/Write
※ 詳細はcamelinaction2/chapter17/cluster-cache-hazelcastとcluster-jcacheのソースを参照
16. l 複数Camelがスケジュール実⾏を共有したい場合、共有スケジュールが必要となります。
l 共有スケジュールは、Quartz+データベースを⽤いて実現します。
l Step1: データベースの準備
l Step2: Quartzのデータベース接続の設定
l Step3: Quartzの使⽤するCamel Routeの実装
Schedule (Quartz)
2020
16
Camel
Route1
Quartz Process Process
Camel
Route2
Quartz Process Process
データベース
※ 詳細はcamelinaction2/chapter17/cluster-quartz2のソースを参照
Read/Write
17. l Service Call EIPは分散型のリモートサービスを呼出しに有効であります。
l Service Call EIPの機能(メリット):
l ロケーション透過性 - サービスの論理名を使⽤することで、Camelとサービスの物理的なロ
ケーションを分離できます。
l URIテンプレート - サービスを呼び出すときに使⽤する物理エンドポイントとして、Camelエ
ンドポイントURIをテンプレート化できます。
l Service Discovery - サービスレジストリからサービスを検索して、サービスの物理エンド
ポイントを検索できます。
l Service Filter - 不要なサービス(ブラックリストに登録されたサービスや異常なサービスな
ど)をフィルタリングできます。
l Service Chooser - 地理的ゾーン、互換性、サービスプラン、カナリアデプロイ、SLAなど
の要因に基づいて最も適切なサービスを選択できます。
l ロードバランサー - 独⾃のロードバランサーが付属しており、カスタマイズ設定がない場合は
デフォルトでインスタンス化され、Service Discovery、Service Filer、Service Chooser、
およびService Expressionが統合されて、使⽤可能なサービス間でリクエストの負荷分散しま
す。
Service Call EIP
2020
17