SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
Camel In Action 2nd edition 読書会
2021年1⽉26⽇
17. Clustering
l 3つのレイヤーでクラスタリングの設計を考慮しましょう。
Camelのクラスタリング
2020
2
Runtime
(Karaf/SpringBoot/WildFly/Tomcat)
CamelContext
Route1
RoutePolicy
Consumer
物理/仮想環境
(ベアメタル/Docker/Kubernetes/OpenShift)
実⾏環境の
クラスタリング
RoutePolicyを使⽤して
Consumer Endpointのクラスタリング
- Hazelcast
- Consul
- Infinispan
- Zookeeper
18章
17章
Route2
Consumer
17章
Process Process
Process Process
個別コンポーネントのクラスタリング
- JMS
- Kafka
- Cache
- Schedule (Quartz)
- Service Call EIP
l Hazelcastは、Javaベースの分散型のインメモリデータグリッド(IMDG)です。
l HazelcastRoutePolicy(*)は、Lock(com.hazelcast.map.IMap)によりConsumerの起動・停⽌
を制御することで、1つのRouteだけ実⾏できるのクラスタリング機能を実現します。
l HazelcastRoutePolicyは、camel-hazelcastにて提供されています。
HazelcastRoutePolicy
2020
3
Camel
Route1
Consumer
Lock
HazelcastRoutePolicy
* https://github.com/apache/camel/blob/master/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java
1
Lock取得
2
Consumer起動
Process Process
Camel
Route1
Consumer
HazelcastRoutePolicy
4
Consumer停⽌
Process Process
3 Lock取得できない
Hazelcast
Tips:
HazelcastRoutePolic
yの詳細を知るには
ソースがオススメ
l org.apache.camel.Mainで起動するCamelアプリケーションの例(*):
HazelcastRoutePolicy
2020
4
public void boot() throws Exception {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
HazelcastRoutePolicy routePolicy = new HazelcastRoutePolicy(hz);
routePolicy.setLockMapName("myLock");
routePolicy.setLockKey("myLockKey");
routePolicy.setLockValue("myLockValue");
routePolicy.setTryLockTimeout(5, TimeUnit.SECONDS);
main = new Main();
main.bind("myPolicy", routePolicy);
main.addRouteBuilder(new FileConsumerRoute("Bar", 100));
main.run();
}
RoutePolicyのセットアップ
(クラスタメンバーが同じ設定に
する)
組込みHazelcastのインスタン
スを初期化
(本番はHazelcastサーバを利
⽤しましょう)
RoutePolicyを
CamelContextに⼊れる
Camel Routeを
CamelContextに⼊れる
* ソース: camelinaction2/chapter17/cluster-file-hazelcast
from("file:target/inbox?delete=true")
.routePolicyRef("myPolicy")
.log(name + " - Received file: ${file:name}");
l Camel Routeの実装例:
RoutePolicyを指定する
l JMX Mbeanを介して、状態参照と操作が可能です。
l org.apache.camel:context=[camel-
context],type=services,name=HazelcastRoutePolicy
HazelcastRoutePolicy
2020
5
リーダーである
ことが分かる
Tips:
他のRoutePolicyも同
じようにMbeanが提
供しています。
l Consulは、HashiCorp社が開発した分散型のサービスレジストリです。
l ConsulRoutePolicyは、LockによりConsumerの起動・停⽌を制御することで、1つのRouteだ
け実⾏できるのクラスタリング機能を実現します。
l Lockの実装は、実体はcom.orbitz.consul.KeyValueClientのCallback関数を利⽤します。
l ConsulRoutePolicy は、Camel 3.xで廃⽌され、代わりに"ConsulClusterService"を使⽤してく
ださい。
ConsulRoutePolicy
2020
6
Camel
Route1
Consumer
ConsulRoutePolicy
1
Lock取得
2
Consumer起動
Process Process
Camel
Route1
Consumer
ConsulRoutePolicy
4
Consumer停⽌
Process Process
3 Lock取得できない
Lock
Consul
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を指定する
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
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"というキャッシュ
を作成しておく
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を指定する
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
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を指定する
注意: ⾃動起動を無効にする
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
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
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のソースを参照
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
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
l リモートサービスの呼出し時の処理フロー
Service Call EIP
2020
18
※ 詳細はcamelinaction2/chapter17/cluster-servicecallのソースを参照

Weitere ähnliche Inhalte

Ähnlich wie 17. camel clustering

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
Trema の紹介とネットワーク仮想化への応用
Trema の紹介とネットワーク仮想化への応用Trema の紹介とネットワーク仮想化への応用
Trema の紹介とネットワーク仮想化への応用kazuyas
 
デバイスからクラウドへ ~組み込みエンジニアと IoT
デバイスからクラウドへ ~組み込みエンジニアと IoTデバイスからクラウドへ ~組み込みエンジニアと IoT
デバイスからクラウドへ ~組み込みエンジニアと IoTShin-ya Koga
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
 
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月VirtualTech Japan Inc.
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudsamemoon
 
「Docker +VLAN 環境」アプリケーション実行環境の構築
「Docker +VLAN 環境」アプリケーション実行環境の構築「Docker +VLAN 環境」アプリケーション実行環境の構築
「Docker +VLAN 環境」アプリケーション実行環境の構築Fuva Brain
 
Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...
 Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management... Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...
Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...SolarisJP
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Sea Mountain
 
20101018 JJUG CCC10 WindowsAzure
20101018 JJUG CCC10 WindowsAzure20101018 JJUG CCC10 WindowsAzure
20101018 JJUG CCC10 WindowsAzureShinichiro Isago
 
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリース
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリースSolarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリース
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリースAtsushi Suzuki
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Raspberry PiとActiveMQで作るセンサーライト
Raspberry PiとActiveMQで作るセンサーライトRaspberry PiとActiveMQで作るセンサーライト
Raspberry PiとActiveMQで作るセンサーライトTakayuki Konishi
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 

Ähnlich wie 17. camel clustering (20)

SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
Trema の紹介とネットワーク仮想化への応用
Trema の紹介とネットワーク仮想化への応用Trema の紹介とネットワーク仮想化への応用
Trema の紹介とネットワーク仮想化への応用
 
デバイスからクラウドへ ~組み込みエンジニアと IoT
デバイスからクラウドへ ~組み込みエンジニアと IoTデバイスからクラウドへ ~組み込みエンジニアと IoT
デバイスからクラウドへ ~組み込みエンジニアと IoT
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月
GMOインターネットにおけるOpenStack Swiftのサービス化とその利用事例のご紹介 - OpenStack最新情報セミナー 2015年2月
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
 
システムコール
システムコールシステムコール
システムコール
 
「Docker +VLAN 環境」アプリケーション実行環境の構築
「Docker +VLAN 環境」アプリケーション実行環境の構築「Docker +VLAN 環境」アプリケーション実行環境の構築
「Docker +VLAN 環境」アプリケーション実行環境の構築
 
Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...
 Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management... Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...
Solaris ディープダイブセミナー #4: A-2-1 サービス実行を超えた 新たなサービス管理アーキテクチャ Service Management...
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
 
20101018 JJUG CCC10 WindowsAzure
20101018 JJUG CCC10 WindowsAzure20101018 JJUG CCC10 WindowsAzure
20101018 JJUG CCC10 WindowsAzure
 
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリース
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリースSolarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリース
Solarflare SolarCapture - 10Gbイーサネットパケットキャプチャソフトウェア リリース
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
TruffleSqueakの紹介
TruffleSqueakの紹介TruffleSqueakの紹介
TruffleSqueakの紹介
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Raspberry PiとActiveMQで作るセンサーライト
Raspberry PiとActiveMQで作るセンサーライトRaspberry PiとActiveMQで作るセンサーライト
Raspberry PiとActiveMQで作るセンサーライト
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 

Mehr von Jian Feng

19. camel tooling
19. camel tooling19. camel tooling
19. camel toolingJian Feng
 
13. parallel processing
13. parallel processing13. parallel processing
13. parallel processingJian Feng
 
11.4 camel on exception
11.4 camel on exception11.4 camel on exception
11.4 camel on exceptionJian Feng
 
11.2 camel error handler
11.2 camel error handler11.2 camel error handler
11.2 camel error handlerJian Feng
 
10.2 camel rest dsl
10.2 camel rest dsl10.2 camel rest dsl
10.2 camel rest dslJian Feng
 
10.1 res tful services
10.1 res tful services10.1 res tful services
10.1 res tful servicesJian Feng
 

Mehr von Jian Feng (6)

19. camel tooling
19. camel tooling19. camel tooling
19. camel tooling
 
13. parallel processing
13. parallel processing13. parallel processing
13. parallel processing
 
11.4 camel on exception
11.4 camel on exception11.4 camel on exception
11.4 camel on exception
 
11.2 camel error handler
11.2 camel error handler11.2 camel error handler
11.2 camel error handler
 
10.2 camel rest dsl
10.2 camel rest dsl10.2 camel rest dsl
10.2 camel rest dsl
 
10.1 res tful services
10.1 res tful services10.1 res tful services
10.1 res tful services
 

17. camel clustering

  • 1. Camel In Action 2nd edition 読書会 2021年1⽉26⽇ 17. Clustering
  • 3. l Hazelcastは、Javaベースの分散型のインメモリデータグリッド(IMDG)です。 l HazelcastRoutePolicy(*)は、Lock(com.hazelcast.map.IMap)によりConsumerの起動・停⽌ を制御することで、1つのRouteだけ実⾏できるのクラスタリング機能を実現します。 l HazelcastRoutePolicyは、camel-hazelcastにて提供されています。 HazelcastRoutePolicy 2020 3 Camel Route1 Consumer Lock HazelcastRoutePolicy * https://github.com/apache/camel/blob/master/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/policy/HazelcastRoutePolicy.java 1 Lock取得 2 Consumer起動 Process Process Camel Route1 Consumer HazelcastRoutePolicy 4 Consumer停⽌ Process Process 3 Lock取得できない Hazelcast Tips: HazelcastRoutePolic yの詳細を知るには ソースがオススメ
  • 4. l org.apache.camel.Mainで起動するCamelアプリケーションの例(*): HazelcastRoutePolicy 2020 4 public void boot() throws Exception { HazelcastInstance hz = Hazelcast.newHazelcastInstance(); HazelcastRoutePolicy routePolicy = new HazelcastRoutePolicy(hz); routePolicy.setLockMapName("myLock"); routePolicy.setLockKey("myLockKey"); routePolicy.setLockValue("myLockValue"); routePolicy.setTryLockTimeout(5, TimeUnit.SECONDS); main = new Main(); main.bind("myPolicy", routePolicy); main.addRouteBuilder(new FileConsumerRoute("Bar", 100)); main.run(); } RoutePolicyのセットアップ (クラスタメンバーが同じ設定に する) 組込みHazelcastのインスタン スを初期化 (本番はHazelcastサーバを利 ⽤しましょう) RoutePolicyを CamelContextに⼊れる Camel Routeを CamelContextに⼊れる * ソース: camelinaction2/chapter17/cluster-file-hazelcast from("file:target/inbox?delete=true") .routePolicyRef("myPolicy") .log(name + " - Received file: ${file:name}"); l Camel Routeの実装例: RoutePolicyを指定する
  • 5. l JMX Mbeanを介して、状態参照と操作が可能です。 l org.apache.camel:context=[camel- context],type=services,name=HazelcastRoutePolicy HazelcastRoutePolicy 2020 5 リーダーである ことが分かる Tips: 他のRoutePolicyも同 じようにMbeanが提 供しています。
  • 6. l Consulは、HashiCorp社が開発した分散型のサービスレジストリです。 l ConsulRoutePolicyは、LockによりConsumerの起動・停⽌を制御することで、1つのRouteだ け実⾏できるのクラスタリング機能を実現します。 l Lockの実装は、実体はcom.orbitz.consul.KeyValueClientのCallback関数を利⽤します。 l ConsulRoutePolicy は、Camel 3.xで廃⽌され、代わりに"ConsulClusterService"を使⽤してく ださい。 ConsulRoutePolicy 2020 6 Camel Route1 Consumer ConsulRoutePolicy 1 Lock取得 2 Consumer起動 Process Process Camel Route1 Consumer ConsulRoutePolicy 4 Consumer停⽌ Process Process 3 Lock取得できない Lock Consul
  • 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
  • 18. l リモートサービスの呼出し時の処理フロー Service Call EIP 2020 18 ※ 詳細はcamelinaction2/chapter17/cluster-servicecallのソースを参照