Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

17. camel clustering

「Camel In Action II」の17章要約です。この章では、Camelルートとコンポーネントのクラスタリング方法について解説します。

  • Login to see the comments

  • Be the first to like this

17. camel clustering

  1. 1. Camel In Action 2nd edition 読書会 2021年1⽉26⽇ 17. Clustering
  2. 2. 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
  3. 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. 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. 5. l JMX Mbeanを介して、状態参照と操作が可能です。 l org.apache.camel:context=[camel- context],type=services,name=HazelcastRoutePolicy HazelcastRoutePolicy 2020 5 リーダーである ことが分かる Tips: 他のRoutePolicyも同 じようにMbeanが提 供しています。
  6. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 18. l リモートサービスの呼出し時の処理フロー Service Call EIP 2020 18 ※ 詳細はcamelinaction2/chapter17/cluster-servicecallのソースを参照

×