ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Event Processing開発者ガイド
11gリリース1 (11.1.1.7) for Eclipse
B61654-06
  目次へ移動
目次

前
 
次
 

25 スケーラブルなアプリケーションの開発

この章では、増加するイベント・ロードに従ってOracle Event Processingアプリケーションをスケールするために使用できるコンポーネントおよび設計パターンについて、およびイベントのパーティション化の設定に関する情報など、Oracle Event Processingアプリケーションのスケーラビリティの構成方法について説明します。

この章の内容は次のとおりです。

25.1 スケーラビリティについて

この項では、増加するイベント・ロードに従ってOracle Event Processingアプリケーションをスケールするために使用できるコンポーネントおよび設計パターンについて説明します。

この節の内容は以下のとおりです。

25.1.1 スケーラビリティ・オプション

Oracle Event Processingは、増加するイベント・ロードに従ってOracle Event Processingアプリケーションをスケールするためのオプションを提供します。

一般的に、イベントの到着時またはイベント処理ネットワーク(EPN)内で、またはその両方で入力イベント・ストリームをパーティション化し、イベントの並列処理ができるようにアプリケーションを設計できます。

イベント処理順序のできるだけ早い段階でスケーラビリティと並列処理を実行する必要があります。たとえば、通常、アプリケーションが依存する低ボリュームイベント、高価値のイベントを抽出するために、高ボリュームと低ボリュームのイベントを並列処理します。

Oracle Event Processingは、25.1.2項「スケーラビリティ・コンポーネント」の説明に従って使用できる、様々なスケーラビリティ・コンポーネントを提供します。

25.1.1.1 スケーラビリティと高可用性

スケーラビリティには多くの場合、複数のサーバーへのアプリケーションのデプロイが含まれているため、スケーラビリティのためにOracle Event Processingアプリケーションを設計するときに、高可用性のオプションも検討すると有利です。

入力ストリームのパーティション化と並列処理は、イベント順序の保存とマルチスレッドの使用の管理などで、アプリケーションの設計を制限します。

高可用性オプションの詳細は、次の項を参照してください。

25.1.2 スケーラビリティ・コンポーネント

Oracle Event Processingでは、Oracle Event Processingアプリケーションのスケーラビリティの向上に使用できる次のコンポーネントを提供します。

25.1.2.1 EventPartitioner

com.bea.wlevs.channel.EventPartitionerは、図25-1に示すように、出力イベント・シンク間でチャネルのイベントをパーティション化するメカニズムを提供します。

図25-1 イベント・パーティショナEPN

図25-1の説明が続きます
「図25-1 イベント・パーティショナEPN」の説明

この項では次について説明します:

詳細は、25.2.1項「チャネルEventPartitionerでのスケーラビリティの構成」を参照してください。

25.1.2.1.1 EventPartitionerの実装

Oracle Event Processingでは、チャネルで使用するよう構成可能な、デフォルトのイベント・プロパティ・ベースのEventPartitionerを提供しています。

デフォルトのEventPartitionerを使用するようチャネルを構成する場合、チャネルがイベントをパーティション化するイベント・プロパティ名を指定します。デフォルトのEventPartitionerでは、イベント・プロパティ値のObject.hashCode()を内部ハッシュ関数への入力として使用し、ハッシュ・キーを計算します。hashkey % number-of-listenersはイベントを受信するリスナーの計算に使用されます。このアルゴリズムは、新規アイテムを配置するバケットを計算する、HashMapで使用するものと同じアルゴリズムに基づいています。実際には、同じイベント・プロパティ値のイベントは、同じリスナーに送信されます。


注意:

デフォルトのイベント・プロパティ・ベースのEventPartitionerでは、ラウンド・ロビン方式でディスパッチされません。


オプションで、チャネルのリスナーへのイベントのディスパッチ方法をカスタマイズするのではなく、独自のイベント・パーティショナ・インスタンスを作成し、チャネルで使用するよう構成することができます。

詳細は、次を参照してください:

25.1.2.1.2 EventPartitionerの初期化

デフォルトでは、Oracle Event Processingサーバーは、デプロイメントの際に各イベント・パーティショナを初期化し、EventPartitionerメソッドactivateConfigurationActivatableBean.afterConfigurationActiveの前、およびEventPartitionerクラスのpartitionメソッドの起動前に起動することによる再デプロイメントの際にはイベント・パーティショナを再初期化します。

25.1.2.1.3 EventPartitionerスレッド

表25-1では、イベント・パーティショナ・チャネルで使用可能なスレッド・オプションが一覧表示されています。

表25-1 イベント・パーティショナ・チャネルのスレッド・オプション

スレッド割当先 説明 使用するタイミング

チャネル

  • チャネルmax-threadsはリスナー数に設定されます。

外部メッセージ形式の内部イベント形式への変換が容易である場合、通常は適用されます。

マルチスレッドをチャネル粒度で制御します。ボリュームが異なるため、一部のチャネルでは他のチャネルより必要なスレッド数が多くなる場合があります。

アダプタ

  • チャネルmax-threadsは0に設定されます。

  • パーティション・リスナーごとに1スレッド以上のマルチスレッド・アダプタを導入します。

外部メッセージ形式の内部イベント形式への変換が難しい場合、通常は推奨されます。

この手法は、アダプタがマルチスレッドであり、インバウンド・イベント・レートが高く、複数スレッドをインバウンド処理のスケールに使用できない場合にアダプタがボトルネックになる場合に最適です。



注意:

どちらの手法でも、イベント順序は保証されません。複数スレッドは随時使用されます。


25.1.2.1.4 EventPartitionerの制限事項

イベント・パーティショナを使用するようにチャネルを構成する場合、次の制限事項を考慮します。

  • イベント・パーティショナでチャネルを構成した場合、バッチ処理はサポートされていません。

    詳細は、10.1.6項「バッチ処理チャネル」を参照してください。

25.1.2.2 ActiveActiveGroupBean

com.oracle.cep.cluster.hagroups.ActiveActiveGroupBeanを使用して、ActiveActiveGroupBeanで作成された通知グループによって、Oracle Event Processingアプリケーションの受信JMSストリームをパーティション化できます。

例25-1で示すように、ActiveActiveGroupBeanをEPNアセンブリ・ファイルに追加します。

例25-1 ActiveActiveGroupBeanのbean要素

<bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
</bean>

デフォルトでは、ActiveActiveGroupBeanは次の名前の通知グループを作成します。

ActiveActiveGroupBean_X

Xは文字列です。

実行時に、ActiveActiveGroupBeanは、Oracle Event Processingサーバーに定義された既存のグループをスキャンし、次のデフォルトのパターン一致を適用します。

ActiveActiveGroupBean_\\w+

一致が見つかったら、その名前の通知グループを作成します。

オプションで、25.2.2.3項「ActiveActiveGroupBeanグループ・パターン一致の構成方法」の説明に従って、独自のクラスタ・グループ・パターン一致を定義できます。

この項では次について説明します:

詳細は、次を参照してください:

25.1.2.2.1 高可用性なしのActiveActiveGroupBeanを使用したOracle Event Processingアプリケーションのスケーラビリティ

ActiveActiveGroupBeanを使用して、高可用性に対して構成されていないOracle Event Processingアプリケーション内のセレクタによって、受信JMSイベント・ストリームをパーティション化できます。

図25-2で示すように、マルチサーバー・ドメインを考慮してください。

図25-2 高可用性なしのOracle Event Processing ActiveActiveGroupBean

図25-2の説明が続きます
「図25-2 高可用性なしのOracle Event Processing ActiveActiveGroupBean」の説明

このスケーラビリティ・シナリオでは、各サーバー(ホスト1のActiveActiveGroupBean_group1、ホスト2のActiveActiveGroupBean_group2など)のOracle Event Processingサーバーconfig.xmlでクラスタ・グループを定義し、Oracle Event ProcessingアプリケーションにActiveActiveGroupBeanのインスタンスを追加して、これらのクラスタ・グループに基づく通知グループを定義します。

各通知グループは、異なるJMSセレクタにバインドされています。Oracle Event Processingアプリケーションにあるコンポーネント構成ファイルの構成は、例25-2で示すように、jms-adapterの構成と同じです。

例25-2 共通jms-adapterセレクタの定義

<jms-adapter>
    <message-selector>${CONDITION}</message-selector>
    <bindings>
        <group-binding group-id="ActiveActiveGroupBean_group1">
            <param id="CONDITION">acctid > 400</param>
        </group-binding>
        <group-binding group-id="ActiveActiveGroupBean_group2">
            <param id="CONDITION">acctid BETWEEN 301 AND 400</param>
        </group-binding>
        <group-binding group-id="ActiveActiveGroupBean_group3">
            <param id="CONDITION">acctid BETWEEN 201 AND 300</param>
        </group-binding>
        <group-binding group-id="ActiveActiveGroupBean_group4">
            <param id="CONDITION">acctid <= 200</param>
        </group-binding>
     </bindings>
</jms-adapter>

実行時に、各Oracle Event Processingサーバーにある各Oracle Event Processingアプリケーション・インスタンスのActiveActiveGroupBeanインスタンスは、ActiveActiveGroupBean_クラスタ・グループを検索し、それに基づいて通信グループを作成します。その後、Oracle Event Processingアプリケーション自体は、その通知グループと一致するgroup-idに対応するmessage-selectorに構成します。これにより、App1の各インスタンスが同時にメッセージの合計数のサブセットを処理するようにJMSトピックはパーティション化されます。


注意:

App1の各インスタンスでは、25.1.2.1項「EventPartitioner」の説明のとおり、イベント・パーティショナ・チャネルを構成して、並列処理をさらに増加することができます。


詳細は、25.2.2.1項「Oracle Event Processing高可用性なしのJMSアプリケーションでスケーラビリティを構成する方法」を参照してください。

25.1.2.2.2 高可用性のあるActiveActiveGroupBeanを使用したOracle Event Processingアプリケーションのスケーラビリティ

セレクタによる受信JMSイベント・ストリームのパーティション化に加えて、ActiveActiveGroupBeanを使用して、単一の高可用性のある単位として2つ以上のOracle Event Processingサーバーを構成できます。

図25-3で示すように、Oracle Event Processing高可用性アプリケーションがデプロイされたマルチサーバー・ドメインを考慮してください。

図25-3 高可用性のあるOracle Event Processing ActiveActiveGroupBean

図25-3の説明が続きます
「図25-3 高可用性のあるOracle Event Processing ActiveActiveGroupBean」の説明

このシナリオでは、ホスト1およびホスト2に同じActiveActiveGroupBean_クラスタ・グループ(ActiveActiveGroupBean_group1)を作成し、ホスト3およびホスト4に同じActiveActiveGroupBean_クラスタ・グループ(ActiveActiveGroupBean_group2)を作成します。

実行時に、各Oracle Event Processingサーバーにある各Oracle Event Processingアプリケーション・インスタンスのActiveActiveGroupBeanインスタンスは、ActiveActiveGroupBean_クラスタ・グループを検索し、それに基づいて通信グループを作成します。ホスト1およびホスト2両方が1つの通知グループ(ActiveActiveGroupBean_group1)に属し、ホスト3およびホスト4両方が別の通信グループ(ActiveActiveGroupBean_group2)に属します。

各Oracle Event Processingアプリケーション自体は、通知グループと一致するgroup-idに対応するmessage-selectorに構成します。これにより、App1の各インスタンスが同時にメッセージの合計数のサブセットを処理するようにJMSトピックはパーティション化されます。

2つ以上のOracle Event Processingサーバーが同じ通知グループに属する場合、ActiveActiveGroupBeanによって、各通信グループのプライマリ・サーバー-のみがイベントを出力するようにします。特定の通知グループ内でプライマリ・サーバーが停止した場合、Oracle Event Processing高可用性フェイルオーバーが発生し、その通知グループのいずれかのセカンダリ・サーバーが新しいプライマリ・サーバーとして宣言され、構成したOracle Event Processing高可用性のサービス品質に応じてイベントの出力を再開します。


注意:

App1の各インスタンスでは、25.1.2.1項「EventPartitioner」の説明のとおり、イベント・パーティショナ・チャネルを構成して、並列処理をさらに増加することができます。


詳細は、25.2.2.2項「Oracle Event Processing高可用性のあるJMSアプリケーションでスケーラビリティを構成する方法」を参照してください。

25.2 スケーラビリティの構成

この項では、イベントのパーティション化の設定に関する情報など、Oracle Event Processingアプリケーションのスケーラビリティの構成方法について説明します。

この節の内容は以下のとおりです。

25.2.1 チャネルEventPartitionerでのスケーラビリティの構成

この項では、図25-4に示すように、Oracle Event Processingイベント・パーティショナでチャネルを構成する次の方法について説明します。

図25-4 EventPartitioner EPN

図25-4の説明が続きます
「図25-4 EventPartitioner EPN」の説明

この例では、inboundアダプタから、例25-3で定義されているタイプPriceEventのイベントが送信されると想定します。

例25-3 イベント・タイプPriceEventの定義

<wlevs:event-type-repository>
    <wlevs:event-type type-name="PriceEvent">
        <wlevs:properties>
            <wlevs:property name="symbol" type="char" />
            <wlevs:property name="price" type="long" />
        </wlevs:properties>
    </wlevs:event-type>
</wlevs:event-type-repository>

詳細は、25.1.2.1項「EventPartitioner」を参照してください。

25.2.1.1 デフォルト・チャネルEventPartitionerでのスケーラビリティの構成方法

デフォルト・イベントのプロパティ・ベースのイベント・パーティショナを使用するようチャネルを構成できます。着信イベントが到着するたびに、チャネルはリスナーを選択し、各リスナーに各イベントをブロードキャストするかわりに、そのリスナーにイベントをディスパッチします。

オプションで、独自のEventPartitionerクラスを実装し、25.2.1.2項「カスタム・チャネルEventPartitionerでのスケーラビリティの構成方法」に示すとおり、チャネルのリスナーへのイベントのディスパッチ方法をカスタマイズできます。

デフォルト・チャネルEventPartitionerでスケーラビリティを構成する手順:

  1. EPNにチャネルを追加します。

    図25-4では、チャネルはEventPartitionerChannelです。

    詳細は、第10章「チャネルを使用したEPNステージの接続」を参照してください。

  2. チャネルをアップストリーム・アダプタに接続します。

    図25-4では、アップストリーム・アダプタはinboundです。

    詳細は、7.4.2項「ノードの接続」を参照してください。

  3. チャネルを複数のリスナーに接続します。

    図25-4では、チャネルはOracle CQLプロセッサprocessor1processor2およびprocessor3に接続されます。

    詳細は、7.4.2項「ノードの接続」を参照してください。

  4. partitionByEventPropertyのインスタンス・プロパティをチャネル要素に追加するようにEPNアセンブリ・ファイルを編集します。

    このinstance-propertyvalueはチャネルがイベントをパーティション化するイベント・プロパティの名前です。

    この例では、チャネルはイベント・プロパティsymbol別にイベントをパーティション化します。

    ...
        <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent">
            <wlevs:instance-property name="partitionByEventProperty" value="symbol" />
            <wlevs:listener ref="processor1" />
            <wlevs:listener ref="processor2" />
            <wlevs:listener ref="processor3" />
            <wlevs:source ref="inbound" />
        </wlevs:channel>
    ...
    

    詳細は、25.1.2.1.1項「EventPartitionerの実装」を参照してください。

  5. 25.1.2.1.3項「EventPartitionerスレッド」の説明のとおり、Oracle Event Processingによるスレッドの割当方法を決定します。

    1. チャネルでスレッドを割り当てる場合:

      • EPNアセンブリ・ファイルを編集し、max-threadsをリスナー数に設定するようチャネルを構成します。

        ...
            <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"        max-threads="3" >
                <wlevs:instance-property name="eventPartitioner" value="true" />
                <wlevs:listener ref="processor1" />
                <wlevs:listener ref="processor2" />
                <wlevs:listener ref="processor3" />
                <wlevs:source ref="inbound" />
            </wlevs:channel>
        ...
        
    2. アップストリーム・アダプタでスレッドを割り当てる場合:

      • EPNアセンブリ・ファイルを編集し、max-threadsを0に設定するようチャネルを構成します。

        ...
            <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"         max-threads="0" >
                <wlevs:instance-property name="eventPartitioner" value="true" />
                <wlevs:listener ref="processor1" />
                <wlevs:listener ref="processor2" />
                <wlevs:listener ref="processor3" />
                <wlevs:source ref="inbound" />
            </wlevs:channel>
        ...
        
      • Oracle Event Processingサーバーconfig.xmlファイルを編集し、work-manager要素を追加します。

        このワーク・マネージャが(他のアダプタおよびJettyなど)複数のコンポーネントで共有されている場合、min-threads-constraintおよびmax-threads-constraint要素をそれぞれリスナー数より大きい値に設定します。

        このワーク・マネージャが複数のコンポーネントで共有されていない場合(つまり、この構成のアップストリーム・アダプタ専用の場合)、min-threads-constraintおよび max-threads-constraint要素をリスナー数と同じ値に設定します。

        ...
        <work-manager>
            <name>adapterWorkManager</name>
            <min-threads-constraint>3</min-threads-constraint>
            <max-threads-constraint>3</max-threads-constraint>
        </work-manager>
        ...
        

        詳細は、F.45項「work-manager」を参照してください。

      • コンポーネント構成ファイルを編集し、このwork-managerでアップストリーム・アダプタを構成します。

        ...
        <adapter>
            <name>inbound</name>
            <work-manager-name>adapterWorkManager</work-manager-name>
            ...
        </adapter>
        ...
        
  6. アプリケーションをアセンブルし、デプロイします。

    詳細は、第23章「Oracle Event Processingアプリケーションのアセンブルとデプロイ」を参照してください。

    実行時は、チャネルではデフォルト・イベント・プロパティ・ベースのEventPartitionerが使用され、それぞれの着信イベントのリスナーへのディスパッチ方法が決定されます。

25.2.1.2 カスタム・チャネルEventPartitionerでのスケーラビリティの構成方法

独自のEventPartitionerクラスを実装すると、チャネルによるリスナーへのイベントのディスパッチ方法をカスタマイズできます。

25.2.1.1項「デフォルト・チャネルEventPartitionerでのスケーラビリティの構成方法」の説明のとおり、オプションで、デフォルトのイベント・プロパティ・ベースのEventPartitionerを使用できます。

カスタム・チャネルEventPartitionerでスケーラビリティを構成する手順:

  1. Oracle Event Processing IDE for Eclipseを使用して、Oracle Event Processingプロジェクトを開きます。

    詳細は、5.2項「Oracle Event Processingプロジェクトの作成」を参照してください。

  2. MANIFEST.MFを編集し、パッケージcom.bea.wlevs.channelをインポートします。

    詳細は、5.7.5項「パッケージのインポート方法」を参照してください。

  3. プロジェクトのsrcフォルダを右クリックし、「新規」>「クラス」を選択します。

    図25-5に示すように、「新規Javaクラス」ダイアログが表示されます。

    図25-5 「新規Javaクラス」ダイアログ

    図25-5の説明が続きます
    「図25-5 「新規Javaクラス」ダイアログ」の説明

  4. 表25-2に示すように、「新規Javaクラス」ダイアログを構成します。

    表25-2 EventPartitionerの「新規Javaクラス」オプション

    オプション 説明

    Package

    クラスのパッケージ名を入力します。

    Name

    クラス名を入力します。

    Interfaces

    「追加」をクリックして実装されているインタフェースの選択ダイアログでcom.bea.wlevs.channel.EventPartitionerインタフェースを特定し、これを「一致するアイテム」リストで選択して「OK」をクリックします。


  5. 「終了」をクリックします。

    例25-4に示すように、新規EventPartitionerクラスが作成されます。

    例25-4 EventPartitionerクラス

    package com.acme;
    
    import com.bea.wlevs.channel.EventPartitioner;
    import com.bea.wlevs.ede.api.EventProcessingException;
    import com.bea.wlevs.ede.api.EventType;
    
    public class MyEventPartitioner implements EventPartitioner {
    
        @Override
        public void activateConfiguration(int arg0, EventType arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public int partition(Object arg0) throws EventProcessingException {
            // TODO Auto-generated method stub
            return 0;
        }
     
    }
    
  6. 例25-5に示すように、EventPartitionerの実装を完了します。

    例25-5 EventPartitionerクラスの実装

    package com.acme;
    
    import com.bea.wlevs.channel.EventPartitioner;
    import com.bea.wlevs.ede.api.EventProcessingException;
    import com.bea.wlevs.ede.api.EventType;
    
    public class MyEventPartitioner implements EventPartitioner {
    
        private final EventType eventType;
        private int numberOfPartitions;
    
        @Override
        public void activateConfiguration(int numberOfPartitions, EventType eventType) {
            this.numberOfPartitions = numberOfPartitions;
            this.eventType = eventType;
        }
    
        @Override
        public int partition(Object event) throws EventProcessingException {
            int dispatchToListener = 0;
            ... // Your implementation.
            return dispatchToListener;
        }
    
    }
    

    activateConfigurationメソッドは、ActivatableBean.afterConfigurationActiveの前、およびEventPartitionerクラスのpartitionメソッドの起動前にOracle Event Processingサーバーが起動するコールバックです。

    このEventPartitionerをチャネルと関連付ける場合、チャネルがイベントを受信するたびに、EventPartitionerクラスのpartitionメソッドが起動されます。

    partitionメソッドは、チャネルによるイベントのディスパッチ先であるリスナーの索引を返す必要があります。索引は0からnumberOfPartitions - 1の間のintである必要があります。

  7. EPNにチャネルを追加します。

    図25-4では、チャネルはEventPartitionerChannelです。

    詳細は、第10章「チャネルを使用したEPNステージの接続」を参照してください。

  8. チャネルをアップストリーム・アダプタに接続します。

    図25-4では、アップストリーム・アダプタはinboundです。

    詳細は、7.4.2項「ノードの接続」を参照してください。

  9. チャネルを複数のリスナーに接続します。

    図25-4では、チャネルはOracle CQLプロセッサprocessor1processor2およびprocessor3に接続されます。

    チャネルでロード・バランシングを実行する場合、各リスナーは同じである必要があります。

    詳細は、次を参照してください:

  10. eventPartitionerのインスタンス・プロパティをチャネル要素に追加するようにEPNアセンブリ・ファイルを編集します。

    このinstance-propertyvalueはチャネルがイベントをパーティション化するためのEventPartitionerインスタンスの完全修飾クラス名です。

    このクラスはOracle Event Processingアプリケーション・クラス・パスにある必要があります。

    この例では、チャネルはEventPartitionerインスタンスcom.acme.MyEventPartitionerを使用してイベントをパーティション化します。

    ...
        <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent" max-threads="0" >
            <wlevs:instance-property name="eventPartitioner"             value="com.acme.MyEventPartitioner" />
            <wlevs:listener ref="filterFanoutProcessor1" />
            <wlevs:listener ref="filterFanoutProcessor2" />
            <wlevs:listener ref="filterFanoutProcessor3" />
            <wlevs:source ref="PriceAdapter" />
        </wlevs:channel>
    ...
    
  11. 25.1.2.1.3項「EventPartitionerスレッド」の説明のとおり、Oracle Event Processingによるスレッドの割当方法を決定します。

    1. チャネルでスレッドを割り当てる場合:

      • EPNアセンブリ・ファイルを編集し、max-threadsをリスナー数に設定するようチャネルを構成します。

        ...
            <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"         max-threads="3" >
                <wlevs:instance-property name="eventPartitioner" value="true" />
                <wlevs:listener ref="processor1" />
                <wlevs:listener ref="processor2" />
                <wlevs:listener ref="processor3" />
                <wlevs:source ref="inbound" />
            </wlevs:channel>
        ...
        
    2. アップストリーム・アダプタでスレッドを割り当てる場合:

      • EPNアセンブリ・ファイルを編集し、max-threadsを0に設定するようチャネルを構成します。

        ...
            <wlevs:channel id="EventPartitionerChannel" event-type="PriceEvent"         max-threads="0" >
                <wlevs:instance-property name="eventPartitioner" value="true" />
                <wlevs:listener ref="processor1" />
                <wlevs:listener ref="processor2" />
                <wlevs:listener ref="processor3" />
                <wlevs:source ref="inbound" />
            </wlevs:channel>
        ...
        
      • Oracle Event Processingサーバーconfig.xmlファイルを編集し、work-manager要素を追加します。

        このワーク・マネージャが(他のアダプタおよびJettyなど)複数のコンポーネントで共有されている場合、min-threads-constraintおよびmax-threads-constraint要素をそれぞれリスナー数より大きい値に設定します。

        このワーク・マネージャが複数のコンポーネントで共有されていない場合(つまり、この構成のアップストリーム・アダプタ専用の場合)、min-threads-constraintおよび max-threads-constraint要素をリスナー数と同じ値に設定します。

        ...
        <work-manager>
            <name>adapterWorkManager</name>
            <min-threads-constraint>3</min-threads-constraint>
            <max-threads-constraint>3</max-threads-constraint>
        </work-manager>
        ...
        

        詳細は、F.45項「work-manager」を参照してください。

      • コンポーネント構成ファイルを編集し、このwork-managerでアップストリーム・アダプタを構成します。

        ...
        <adapter>
            <name>inbound</name>
            <work-manager-name>adapterWorkManager</work-manager-name>
            ...
        </adapter>
        ...
        
  12. アプリケーションをアセンブルし、デプロイします。

    詳細は、第23章「Oracle Event Processingアプリケーションのアセンブルとデプロイ」を参照してください。

    実行時は、チャネルではEventPartitionerが使用され、それぞれの着信イベントのリスナーへのディスパッチ方法が決定されます。

25.2.2 ActiveActiveGroupBeanでのスケーラビリティの構成

この項では、セレクタで受信JMSイベント・ストリームをパーティションするためにActiveActiveGroupBeanを使用するようにOracle Event Processingアプリケーションを構成する方法について説明します。次の項が含まれます。

詳細は、25.1.2.2項「ActiveActiveGroupBean」を参照してください。

25.2.2.1 Oracle Event Processing高可用性なしのJMSアプリケーションでスケーラビリティを構成する方法

Oracle Event Processing高可用性を使用しないアプリケーションの場合、マルチサーバー・ドメインでセレクタを使用して受信JMSイベント・ストリームをパーティションするためにActiveActiveGroupBeanを使用できます。

Oracle Event Processing高可用性アプリケーションでActiveActiveGroupBeanを使用する方法は、25.2.2.2項「Oracle Event Processing高可用性を使用してJMSアプリケーションでスケーラビリティを構成する方法」を参照してください。

詳細は、25.1.2.2.1項「高可用性なしのActiveActiveGroupBeanを使用したOracle Event Processingアプリケーションのスケーラビリティ」を参照してください。

Oracle Event Processing高可用性なしのJMSアプリケーションでスケーラビリティを構成する手順:

  1. マルチサーバー・ドメインを作成します。

    詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のマルチサーバー・ドメインの概要に関する項を参照してください。

    この例では、デプロイメント・グループの名前は、MyDeploymentGroupです。

  2. 適切なActiveActiveGroupBean通知グループをcluster要素のgroups子要素に追加するように各Oracle Event ProcessingサーバーのOracle Event Processingサーバー構成ファイルを構成します。

    Oracle Event Processingサーバー構成ファイルのconfig.xmlは、DOMAIN_DIR/servername/configディレクトリにあります。DOMAIN_DIRは、メイン・ドメイン・ディレクトリを示し、servernameは、特定のサーバー・インスタンスを示します。

    たとえば、表25-4では、ocep-server-1ocep-server-2ocep-server-3およびocep-server-4のOracle Event Processingサーバーのcluster要素を示します。デプロイメント・グループはMyDeploymentGroupであり、通知グループはデフォルトのActiveActiveGroupBean通知グループ・ネーミングを使用して定義します。

    オプションで、25.2.2.3項「ActiveActiveGroupBeanグループ・パターン一致の構成方法」"に示すグループのネーミング・ルールを指定することができます。

    表25-3 Oracle Event Processingサーバー構成ファイル・グループ要素構成

    パーティション cluster要素

    ocep-server-1

    <cluster>
        <server-name>ocep-server-1</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
    </cluster>
    

    ocep-server-2

    <cluster>
        <server-name>ocep-server-2</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
    </cluster>
    

    ocep-server-3

    <cluster>
        <server-name>ocep-server-3</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group3</groups>
    </cluster>
    

    ocep-server-4

    <cluster>
        <server-name>ocep-server-4</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group4</groups>
    </cluster>
    

  3. Oracle Event Processingアプリケーションを作成します。

  4. EPNアセンブリ・ファイルを構成し、例25-10に示すようにActiveActiveGroupBean要素を追加します。

    例25-6 ActiveActiveGroupBeanのbean要素

    <bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
    </bean>
    
  5. JMSインバウンド・アダプタのjms-adapter要素にパラメータ化されたmessage-selectorを定義します。

    JMSインバウンド・アダプタのjms-adapter要素にgroup-binding子要素を追加するために、コンポーネント構成ファイルを編集します。

    例25-12示すように、各可能JMSメッセージ・セレクタ値に対して1つのgroup-binding要素を追加します。

    例25-7 ocep-server-1用のjms-adapterセレクタ定義

    <jms-adapter>
        <name>JMSInboundAdapter</name>
        <event-type>StockTick</event-type>
        <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
        <destination-jndi-name>./Topic1</destination-jndi-name>
        <user>weblogic</user>
        <password>weblogic1</password>
        <work-manager>JettyWorkManager</work-manager>
        <concurrent-consumers>1</concurrent-consumers>
        <session-transacted>true</session-transacted>
        <message-selector>${CONDITION}</message-selector>
        <bindings>
            <group-binding group-id="ActiveActiveGroupBean_group1">
                <param id="CONDITION">acctid > 400</param>
            </group-binding>
            <group-binding group-id="ActiveActiveGroupBean_group2">
                <param id="CONDITION">acctid BETWEEN 301 AND 400</param>
            </group-binding>
            <group-binding group-id="ActiveActiveGroupBean_group3">
                <param id="CONDITION">acctid BETWEEN 201 AND 300</param>
            </group-binding>
            <group-binding group-id="ActiveActiveGroupBean_group4">
                <param id="CONDITION">acctid <= 200</param>
            </group-binding>
         </bindings>
    </jms-adapter>
    

    この構成では、ActiveActiveGroupBean_group1を含むcluster要素、groups子要素でアプリケーションをOracle Event Processingサーバーにデプロイすると、CONDITIONパラメータがacctid > 400と定義され、acctidプロパティが400以上であるイベントがアプリケーションにより処理されます。


    注意:

    各インバウンドJMSアダプタは異なるトピックをリスニングする必要があります。

    詳細は、第11章「Java Message Serviceの統合」を参照してください。


  6. マルチサーバー・ドメインのデプロイメント・グループにアプリケーションをデプロイします。

    詳細は、第23章「Oracle Event Processingアプリケーションのアセンブルとデプロイ」を参照してください。

    実行時に、各Oracle Event ProcessingサーバーがActiveActiveGroupBean通知グループに対するmessage-selectorにアプリケーションのインスタンスを構成します。これにより、アプリケーションの各インスタンスがメッセージ総数のサブセットを並行して処理するようにJMSトピックがパーティションされます。

25.2.2.2 Oracle Event Processing高可用性のあるJMSアプリケーションでスケーラビリティを構成する方法

ActiveActiveGroupBeanを使用して、Oracle Event Processing高可用性のマルチサーバー・ドメインで受信JMSイベント・ストリームをパーティションできます。

この手順では、図25-6に示すサンプルEPN、例25-8に示す対応するEPNアセンブリ・ファイルおよび例25-9に示す対応するコンポーネント構成ファイルを含む24.2.1.4項「JMSによる正確なリカバリの構成方法」のサンプル・アプリケーションを使用します。

図25-6 JMSのEPNによる正確なリカバリ

図25-6の説明が続きます
「図25-6 JMSのEPNによる正確なリカバリ」の説明

例25-8 JMS EPNアセンブリ・ファイルを使用して精度の高いリカバリ

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >

    <wlevs:event-type-repository>
        <wlevs:event-type type-name="StockTick">
            <wlevs:properties>
                <wlevs:property name="lastPrice" type="double" />
                <wlevs:property name="symbol" type="char" />
            </wlevs:properties>
        </wlevs:event-type>
    </wlevs:event-type-repository>

    <wlevs:adapter id="JMSInboundAdapter" provider="jms-inbound">
        <wlevs:listener ref="myHaInputAdapter"/>
    </wlevs:adapter>

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
        <wlevs:instance-property name="keyProperties" value="sequenceNo"/>
        <wlevs:instance-property name="timeProperty" value="inboundTime"/>
    </wlevs:adapter>

    <wlevs:channel id="channel1" event-type="StockTick">
        <wlevs:listener ref="processor1" />
        <wlevs:source ref="myHaInputAdapter"/>
        <wlevs:application-timestamped>
            <wlevs:expression>inboundTime</wlevs:expression>
        </wlevs:application-timestamped>
    </wlevs:channel>

    <wlevs:processor id="processor1">
        <wlevs:listener ref="channel2" />
    </wlevs:processor>

    <wlevs:channel id="channel2" event-type="StockTick">
        <wlevs:listener ref="myHaCorrelatingAdapter" />
    </wlevs:channel>

    <wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
        <wlevs:instance-property name="correlatedSource" ref="clusterCorrelatingOutstream"/> 
        <wlevs:instance-property name="failOverDelay" value="2000"/> 
        <wlevs:listener ref="JMSOutboundAdapter"/>
    </wlevs:adapter>

    <wlevs:adapter id="JMSOutboundAdapter" provider="jms-outbound">
    </wlevs:adapter>

    <wlevs:adapter id="JMSInboundAdapter2" provider="jms-inbound">
    </wlevs:adapter>

    <wlevs:channel id="clusterCorrelatingOutstream" event-type="StockTick" advertise="true">
        <wlevs:source ref="JMSInboundAdapter2"/>
    </wlevs:channel> 
</beans>

例25-9 JMSコンポーネント構成アセンブリ・ファイルを使用して精度の高いリカバリ

<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config 
        xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
        xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
    <processor>
        <name>processor1</name>
        <rules>
            <query id="helloworldRule">
                <![CDATA[ select * from channel1 [Now] ]]>
            </query>
        </rules>
    </processor>
    <jms-adapter>
        <name>JMSInboundAdapter</name>
        <event-type>StockTick</event-type>
        <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
        <destination-jndi-name>./Topic1</destination-jndi-name>
        <session-transacted>true</session-transacted>
    ...
    </jms-adapter>
    <jms-adapter>
        <name>JMSInboundAdapter2</name>
        <event-type>StockTick</event-type>
        <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
        <destination-jndi-name>./Topic2</destination-jndi-name>
        <session-transacted>true</session-transacted>
    ...
    </jms-adapter>
    <jms-adapter>
        <name>JMSOutboundAdapter</name>
        <event-type>StockTick</event-type>
        <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
        <destination-jndi-name>./Topic2</destination-jndi-name>
        <session-transacted>true</session-transacted>
    ...
    </jms-adapter>
</wlevs:config>

図25-7に示すように、この手順実行の結果、Oracle Event Processing高可用性構成が作成されます。

図25-7 高可用性のあるOracle Event Processing ActiveActiveGroupBean

図25-7の説明が続きます
「図25-7 高可用性のあるOracle Event Processing ActiveActiveGroupBean」の説明

詳細は、25.1.2.2.2項「高可用性のあるActiveActiveGroupBeanを使用したOracle Event Processingアプリケーションのスケーラビリティ」を参照してください。

Oracle Event Processing高可用性のあるJMSアプリケーションでスケーラビリティを構成する手順:

  1. マルチサーバー・ドメインを作成します。

    詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のマルチサーバー・ドメインの概要に関する項を参照してください。

    この例では、デプロイメント・グループの名前は、MyDeploymentGroupです。

  2. 適切なActiveActiveGroupBean通知グループをcluster要素のgroups子要素に追加するように各Oracle Event ProcessingサーバーのOracle Event Processingサーバー構成ファイルを構成します。

    Oracle Event Processingサーバー構成ファイルのconfig.xmlは、DOMAIN_DIR/servername/configディレクトリにあります。DOMAIN_DIRは、メイン・ドメイン・ディレクトリを示し、servernameは、特定のサーバー・インスタンスを示します。

    たとえば、表25-4では、ocep-server-1ocep-server-2ocep-server-3およびocep-server-4のOracle Event Processingサーバーのcluster要素を示します。デプロイメント・グループはMyDeploymentGroupであり、通知グループはデフォルトのActiveActiveGroupBean通知グループ・ネーミングを使用して定義します。

    ocep-server-1ocep-server-2は同一の通知グループ名前(ActiveActiveGroupBean_group1)を使用し、ocep-server-3ocep-server-4は同一の通知グループ名前(ActiveActiveGroupBean_group2)を使用します。

    オプションで、25.2.2.3項「ActiveActiveGroupBeanグループ・パターン一致の構成方法」"に示すグループのネーミング・ルールを指定することができます。

    表25-4 Oracle Event Processingサーバー構成ファイル・グループ要素構成

    パーティション cluster要素

    ocep-server-1

    <cluster>
        <server-name>ocep-server-1</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
    </cluster>
    

    ocep-server-2

    <cluster>
        <server-name>ocep-server-2</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group1</groups>
    </cluster>
    

    ocep-server-3

    <cluster>
        <server-name>ocep-server-3</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
    </cluster>
    

    ocep-server-4

    <cluster>
        <server-name>ocep-server-4</server-name>
        ...
        <enabled>coherence</enabled>
        ...
        <groups>MyDeploymentGroup, ActiveActiveGroupBean_group2</groups>
    </cluster>
    

  3. Oracle Event Processing高可用性アプリケーションを作成します。

    詳細は、第24章「高可用性のためのアプリケーションの開発」を参照してください。

  4. EPNアセンブリ・ファイルを構成し、例25-10に示すようにActiveActiveGroupBean要素を追加します。

    例25-10 ActiveActiveGroupBeanのbean要素

    <bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
    </bean>
    
  5. コンポーネント構成ファイルを編集し、例25-11に示すように、インバウンドJMSアダプタ用のjms-adapter要素を構成します。

    • 各インバウンドJMSアダプタは異なるトピックをリスニングする必要があります。

    • session-transactedtrueに設定します。

    例25-11 インバウンドJMSアダプタ用のjms-adapter要素

    <?xml version="1.0" encoding="UTF-8"?>
    <wlevs:config 
            xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
            xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
        ...
        <jms-adapter>
            <name>JMSInboundAdapter</name>
            <event-type>StockTick</event-type>
            <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
            <destination-jndi-name>./Topic1</destination-jndi-name>
            <session-transacted>true</session-transacted>
        ...    </jms-adapter>
        <jms-adapter>
            <name>JMSInboundAdapter2</name>
            <event-type>StockTick</event-type>
            <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <session-transacted>true</session-transacted>
        ...    </jms-adapter>
    </wlevs:config>
    

    詳細は、第11章「Java Message Serviceの統合」を参照してください。

  6. 各JMSインバウンド・アダプタのjms-adapter要素にパラメータ化されたmessage-selectorを定義します。

    JMSインバウンド・アダプタのjms-adapter要素にgroup-binding子要素を追加するために、コンポーネント構成ファイルを編集します。

    例25-12示すように、各可能JMS message-selector値に対して1つのgroup-binding要素を追加します。

    例25-12 ocep-server-1用のjms-adapterセレクタ定義

    <jms-adapter>
        <name>JMSInboundAdapter</name>
        <event-type>StockTick</event-type>
        <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
        <destination-jndi-name>./Topic1</destination-jndi-name>
        <session-transacted>true</session-transacted>
        <message-selector>${CONDITION}</message-selector>
        <bindings>
            <group-binding group-id="ActiveActiveGroupBean_group1">
                <param id="CONDITION">acctid <= 1000</param>
            </group-binding>
            <group-binding group-id="ActiveActiveGroupBean_group2">
                <param id="CONDITION">acctid > 1000</param>
            </group-binding>
         </bindings>
    </jms-adapter>
    

    この構成では、ActiveActiveGroupBean_group1を含むcluster要素、groups子要素を持つアプリケーションをOracle Event Processingサーバーにデプロイすると、CONDITIONパラメータがacctid <= 1000と定義され、acctidプロパティが1000以下であるイベントがアプリケーションにより処理されます。同様に、ActiveActiveGroupBean_group2を含むcluster要素、groups子要素を持つアプリケーションをOracle Event Processingサーバーにデプロイすると、CONDITIONパラメータがacctid > 1000と定義され、acctidプロパティが1000以上であるイベントがアプリケーションにより処理されます。

  7. コンポーネント構成ファイルを編集し、例25-13に示すように、アウトバウンドJMSアダプタ用のjms-adapter要素を構成します。

    • 対応するインバウンド・アダプタ(この例では、JMSInboundAdapter2: ./Topic2)と同一トピックでアウトバウンドJMSアダプタを構成します。

    • session-transactedtrueに設定します。

    例25-13 アウトバウンドJMSアダプタ用のjms-adapter要素

    <?xml version="1.0" encoding="UTF-8"?>
    <wlevs:config 
            xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
            xmlns:ha="http://www.oracle.com/ns/cep/config/cluster">
        ...
        <jms-adapter>
            <name>JMSInboundAdapter</name>
            <event-type>StockTick</event-type>
            <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
            <destination-jndi-name>./Topic1</destination-jndi-name>
            <session-transacted>true</session-transacted>
        ...    </jms-adapter>
        <jms-adapter>
            <name>JMSInboundAdapter2</name>
            <event-type>StockTick</event-type>
            <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <session-transacted>true</session-transacted>
        ...    </jms-adapter>
        <jms-adapter>
            <name>JMSOutboundAdapter</name>
            <event-type>StockTick</event-type>
            <jndi-provider-url>t3://ppurich-pc:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <session-transacted>true</session-transacted>
        ...    </jms-adapter>
    </wlevs:config>
    

    詳細は、第11章「Java Message Serviceの統合」を参照してください。

  8. マルチサーバー・ドメインのデプロイメント・グループにアプリケーションをデプロイします。

    詳細は、第23章「Oracle Event Processingアプリケーションのアセンブルとデプロイ」を参照してください。

    実行時に、各Oracle Event ProcessingサーバーがActiveActiveGroupBean通知グループに対するmessage-selectorにアプリケーションのインスタンスを構成します。これにより、アプリケーションの各インスタンスがメッセージ総数のサブセットを並行して処理するようにJMSトピックがパーティションされます。

    ActiveActiveGroupBeanグループの有効なOracle Event Processingサーバーが停止すると、そのActiveActiveGroupBeanグループのスタンバイOracle Event Processingサーバーに対してOracle Event ProcessingサーバーがOracle Event Processing高可用性フェイルオーバーを実行します。

25.2.2.3 ActiveActiveGroupBeanグループ・パターン一致の構成方法

デフォルトでは、ActiveActiveGroupBeanは次の名前の通知グループを作成します。

ActiveActiveGroupBean_X

Xは文字列です。

実行時に、ActiveActiveGroupBeanは、Oracle Event Processingサーバーに定義された既存のグループをスキャンし、次のデフォルトのパターン一致を適用します。

ActiveActiveGroupBean_\\w+

一致が見つかったら、その名前の通知グループを作成します。

オプションで、別の通知グループ・ネーミング・パターンを指定するために独自のグループ・パターンを定義できます。

ActiveActiveGroupBeanグループ・パターン一致の構成方法

  1. EPNアセンブリ・ファイルを構成し、例25-14に示すように、ActiveActiveGroupBean要素にgroupPattern属性を追加します。

    例25-14 groupPattern属性を持つActiveActiveGroupBeanのbean要素

    <bean id="clusterAdapter" class="com.oracle.cep.cluster.hagroups.ActiveActiveGroupBean">
        <property name="groupPattern" value="MyNotificationGroupPattern*"/>
    </bean>
    
  2. 通知グループに対し使用するクラスタ・グループ・ネーミング・ルールに一致するgroupPattern属性の値を指定します。