プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processingアプリケーションの開発
12c リリース1 (12.1.3)
E54312-04
目次へ移動
目次

前
前へ
次
次へ

17 高可用性アプリケーション

Oracle Event Processingアプリケーションは常にストリーミング・データを監視するため、高可用性が不可欠です。Oracle Event Processingは、アプリケーション設計パターンと高可用性アダプタによって、アプリケーションのバックアップおよびフェイルオーバー処理の能力を強化します。

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

17.1 Oracle Coherence

Oracle Event Processingの高可用性オプションは、Oracle Coherenceに依存します。Oracle Coherenceを使用せずにOracle Event Processingの高可用性オプションを実装することはできません。

パフォーマンスのチューニングを検討する場合、Oracle Event Processingアプリケーションに加えて必ずOracle Coherenceの構成を評価します。

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

17.2 アーキテクチャ

Oracle Event Processingは、アクティブ・アクティブ高可用性アーキテクチャをサポートします。この方法には、高パフォーマンス、簡素性、およびフェイルオーバー時間の短縮という利点があり、データやサービスの障害が発生する可能性やその影響が緩和されます。

高可用性アプリケーションは、マルチサーバー・ドメインで稼働している複数のOracle Event Processingサーバーのグループにデプロイします。Oracle Event Processingは、グループ内の1つのサーバーをアクティブ・プライマリ・サーバーとして選択します。他のサーバーは、アクティブ・セカンダリ・サーバーとなります。

プライマリ・サーバーおよびセカンダリ・サーバーは、同一の入力イベントを受信するように構成され、それらを並列に処理しますが、プライマリ・サーバーのみがOracle Event Processingアプリケーション・クライアントにイベントを出力します。選択したサービス品質に依存して、セカンダリ・サーバーはインメモリー・キューを使用してそのような出力イベントをバッファリングし、プライマリ・サーバーは、プライマリ・サーバーが出力済のイベントを使用してセカンダリ・サーバーを最新に保ちます。

図17-1に、アクティブ・サーバー1つとプライマリ・サーバー2つの一般的な構成を示します。

図17-1 Oracle Event Processingの高可用性: プライマリ・サーバーおよびセカンダリ・サーバー

図17-1の説明が続きます
「図17-1 Oracle Event Processingの高可用性: プライマリ・サーバーおよびセカンダリ・サーバー」の説明

17.3 ライフサイクルとフェイルオーバー

図17-2は、Oracle Event Processingの高可用性ライフサイクルの状態図を示します。この図では、状態名(SECONDARYBECOMING_PRIMARYおよびPRIMARY)はOracle Event Processingの高可用性アダプタのRuntimeMBeanメソッドのgetStateの戻り値に対応します。このような状態はOracle Event Processing専用です。高可用性アダプタの詳細は、「高可用性入力アダプタ」を参照してください。

図17-2 Oracle Event Processingの高可用性ライフサイクルの状態図

図17-2の説明が続きます
「図17-2 Oracle Event Processingの高可用性ライフサイクルの状態図」の説明

初期プライマリ・サーバーを指定することはできません。初期状態では、マルチサーバー・ドメインで起動する第1サーバーがプライマリになるため、特定の順序でサーバーを起動することによって、プライマリの選択に影響を与えることができます。稼働中の特定のサーバーを強制的にプライマリにすることはできません。プライマリが失敗するとバックアップが機能し、現在のプライマリがフェイルオーバーの起動に失敗しないかぎり、二度と自動的にプライマリになりません。

17.3.1 セカンダリの障害

通常、セカンダリ・サーバーに障害が発生しても図17-3に示すようにOracle Event Processingアプリケーションの動作には影響はありません。選択するサービス品質に関係なくイベントの欠落や重複は発生しません。

図17-3 セカンダリの障害

図17-3の説明が続きます
「図17-3 セカンダリの障害」の説明

17.3.2 プライマリの障害およびフェイルオーバー

プライマリ・サーバーで障害が発生した場合、図17-4で示すように、選択するサービス品質に応じて、Oracle Event Processingはイベントの欠落や重複を発生させる可能性があるフェイルオーバーを実行します。

図17-4 プライマリの障害およびフェイルオーバー

図17-4の説明が続きます
「図17-4 プライマリの障害およびフェイルオーバー」の説明

フェイルオーバー中、Oracle Event Processingは新しいプライマリおよびSECONDARY状態からBECOMING_PRIMARY状態への新しいプライマリの遷移を選択します。選択するサービス品質に依存して、新しいプライマリは構成可能な準備状況のしきい値を満たすまでPRIMARY状態に遷移しません。詳細は、サービス品質オプションの選択にある特定のサービス品質オプションを参照してください。

17.3.3 高可用性マルチサーバー・ドメインの再結合

新しいOracle Event ProcessingサーバーがOracle Event Processing高可用性マルチサーバー・ドメインに追加される場合、または既存の障害が発生したサーバーが再起動する場合、サーバーは、サーバーにデプロイされたすべてのアプリケーションが完全に結合するまで、Oracle Event Processing高可用性デプロイメントと通知グループを完全には結合しません。いつ完全に結合できるかは、アプリケーションの種類によって異なります。

アプリケーションが完全に同一の出力イベントのシーケンスを既存のセカンダリとして出力する必要がある場合(タイプ1アプリケーション)、一部の有限の期間(warm-up-window-lengthの期間)の入力ストリームを処理することによって、アプリケーションはその内部状態を再構築できます。このwarm-up-window-lengthの時間によって、アプリケーションが完全にOracle Event Processing高可用性デプロイメントと通知グループを結合するのにかかる最短時間が決定されます。

アプリケーションが完全に同一の出力イベントのシーケンスを既存のセカンダリとして出力する必要がない場合(タイプ2アプリケーション)、warm-up-window-lengthの時間はかからず、アプリケーションはデプロイされたときにOracle Event Processing高可用性デプロイメントと通知グループを完全に結合します。

詳細は、適切なwarm-up-window-length時間の選択を参照してください。

17.4 デプロイメント・グループおよび通知グループ

マルチサーバー・ドメイン内のすべてのサーバーは、同一のデプロイメント・グループに属します。デプロイメント・グループは、アプリケーションをデプロイする対象のグループです。Oracle Event Processingの高可用性のために同一のアプリケーションをグループ内のすべてのサーバーにデプロイする必要があります。

デフォルトでは、マルチサーバー・ドメイン内のすべてのサーバーも同一の通知グループに属します。サーバーは、サーバーで障害が発生したとき(およびグループを終了したとき)または動作を再開したとき(およびグループを再結合したとき)を示すメンバーシップ通知用の通知グループとともに、プライマリからの同期通知用の通知グループをリスニングします。

Oracle Event Processingの高可用性アプリケーションのスケールを変更する必要がある場合、ActiveActiveGroupBeanを使用して、すべてのサーバー(プライマリおよびセカンダリ)に広がる単一のデプロイメント・グループの利点を保持する一方で、プライマリ・サーバー・ユニットとして2つ以上のサーバーを機能させることを許可する通知グループを定義します。

マルチサーバー・ドメインのデプロイメント・グループを作成するためには、Oracle Coherenceベースのクラスタリングを使用する必要があります。デフォルト・グループまたはカスタム・グループのいずれかを使用できます。

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

17.5 高可用性アダプタ

Oracle Event Processing高可用性を実装するには、高可用性入力アダプタ(オプション)と、高可用性出力アダプタ(必須)をEPNに追加します。

高可用性入力アダプタ

プライマリ・サーバーのオプションの高可用性入力アダプタは、各セカンダリ・サーバーの対応する高可用性入力アダプタと通信し、イベント・タイムスタンプを正規化します。Oracle Event Processingの高可用性によって、高可用性入力アダプタの1つの種類が提供されます。

高可用性入力アダプタを参照してください。

高可用性出力アダプタ

アプリケーションに高可用性の機能を実装するには、EPNで各出力アダプタの前に高可用性出力アダプタを配置します。プライマリ・サーバーの高可用性出力アダプタは、Oracle Event Processingアプリケーションをダウンストリーム・クライアントに接続する出力ストリームにイベントを出力します。

プライマリの高可用性出力アダプタも対応する各セカンダリの高可用性出力アダプタと通信を行い、選択する高可用性のサービス品質に依存して、セカンダリ出力アダプタに出力イベントのインメモリー・キューをトリミングするように命令することができます。

高可用性出力アダプタの詳細は、バッファリング出力アダプタブロードキャスト出力アダプタおよび相関出力アダプタを参照してください。どの出力アダプタを選択するかは、選択する高可用性のサービス品質によって決定されます。サービス品質オプションの選択を参照してください。

図17-5は、定位置にすべての実行可能な高可用性アダプタを持つEPNを簡略化して示しています。この図ではチャネルがなくプロセッサが1つです。

図17-5 EPN内の高可用性アダプタ

図17-5の説明が続きます
「図17-5 EPN内の高可用性アダプタ」の説明

17.5.1 高可用性入力アダプタ

各イベントはイベントの発生時点で関連付けられます。イベント・タイムスタンプを生成するには、アプリケーション・タイムスタンプとシステム・タイムスタンプの2つの方法があります(アプリケーション・タイムスタンプとシステム・タイムスタンプの詳細は、「チャネル」を参照してください)。アプリケーション時間とは、イベントがCQLプロセッサに入る前に、時間値がアプリケーションによって外部で各イベントに割り当てられることを意味します。システム時間とは、CQLプロセッサへの到着時に、時間値がOracle Event Processingによって自動的にイベントに関連付けられることを意味します。

アプリケーション時間は、通常、アプリケーションの高可用性のために必要な最善の選択です。アプリケーション時間は、Oracle Event Processingにイベントが送信される前にイベントに関連付けられるため、アクティブなプライマリおよびセカンダリのインスタンスの全体に渡って整合性があります。システム時間は、システム・クロックが同期されていないことによって、イベントに関連付けられた時間値が各インスタンスで異なる可能性があるためアプリケーションのインスタンスに異なる結果を生成させます。

CQLの問合せが時間ベースのウィンドウを使用しないアプリケーションについては、システム時間を使用しても問題ありません。イベントベースのウィンドウのみ使用するアプリケーションは、受信時間ではなくイベントを受信した順番に依存するためこの場合はシステム時間を使用できます。

時間ベースのウィンドウを使用し、外部で生成された(アプリケーション)タイムスタンプを持たないアプリケーションについては、オプションのOracle Event Processing高可用性入力アダプタを使用して、すべてのサーバーで一定の時間値を指定できます。プライマリ・サーバー上の入力アダプタ・インスタンスは、イベントがアダプタに到着した時点でイベントに時間を割り当て(ナノ秒単位)、各イベントに割り当てられた時間値をすべてのセカンダリ・サーバーに転送します。

時間値は、EPN内の任意のダウンストリーム・チャネルにイベントが到着する前に各イベントに割り当てられるため、ダウンストリーム・チャネルは、イベントのチャネル到着時に新しい時間値をイベントに割り当てないようにアプリケーションの時間を使用するように構成する必要があります。

入力イベントは、このアダプタを使用するために各イベントを一意で識別するキーを持つ必要があります。

Oracle Event Processingの高可用性入力アダプタをハートビート・イベントを送信するように構成できます。

Oracle Event Processingの高可用性入力アダプタは、すべての高可用性のサービス品質オプションに適用できます。ただし、高可用性入力アダプタはパフォーマンスのオーバーヘッドを増加するため、一部の高可用性サービス品質オプション(「シンプル・フェイルオーバー」および「バッファリングを使用するシンプル・フェイルオーバー」など)には適しません。このようなオプションでは、かわりにアプリケーション時間と何らかの着信イベント・プロパティの使用を検討します。

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

17.5.2 バッファリング出力アダプタ

Oracle Event Processingの高可用性バッファリング出力アダプタは、バッファリング型キュー・トリミング方式を実装します。バッファはストリームからの出力イベントのスライディング・ウィンドウです。ウィンドウのサイズはミリ秒単位で測定されます。

Oracle Event Processingの高可用性バッファリング出力アダプタは、シンプル・フェイルオーバーおよび高可用性のサービス品質オプションのバッファリングを使用するシンプル・フェイルオーバーに適用されます。

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

17.5.3 ブロードキャスト出力アダプタ

Oracle Event Processingの高可用性ブロードキャスト出力アダプタは、分散型キュー・トリミング方式を実装します。アクティブ・プライマリ・インスタンスは、メッセージを通知グループ内のアクティブ・セカンダリ・インスタンスにブロードキャストし、キューのローカル表現をトリミングするタイミングを通知します。

Oracle Event Processing高可用性ブロードキャスト出力アダプタは、軽量キュー・トリミングの高可用性のサービス品質オプションに適用されます。

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

17.5.4 相関出力アダプタ

Oracle Event Processingの高可用性相関出力アダプタは、通常はJMSから2つのイベント・ストリームを関連付けます。このアダプタは、イベントのインバウンド・バッファと同一イベント・ストリームのセカンド・ソースに関連付け、構成可能な時間間隔の後で相関関係付けに障害が発生する場合にバッファを出力します。関連付けられたイベントは、キューからトリミングされます。関連付けられたイベントは、順序通りに整理されると仮定されます。

Oracle Event Processingの高可用性相関出力アダプタは、JMS高可用性のサービス品質オプションを使用する正確なリカバリに適用されます。

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

17.6 高可用性およびスケーラビリティ

Oracle Event Processing高可用性アプリケーションのスケールを変更する必要がある場合は、通知グループのSpring BeanであるActiveActiveGroupBeanを使用すると、JMSアプリケーションのスケーラビリティが向上します。

ActiveActiveGroupBeanでは、すべてのサーバー(プライマリおよびセカンダリ)に広がる単一のデプロイメント・グループの利点を保持する一方で、複数のサーバーを1つの高可用性ユニットとして機能させることが可能な通知グループを定義します。

図17-6は、最も単純な構成から高可用性、そして高可能性とスケーラビリティの両方へと至る3つのOracle Event Processingアプリケーションのシナリオを示します。

図17-6 高可用性およびスケーラビリティ

図17-6の説明が続きます
「図17-6 高可用性およびスケーラビリティ」の説明

大半のアプリケーションは、高可用性を持たないシングルサーバー・ドメインで起動します。この最も単純なシナリオの場合、1つのOracle Event Processingサーバーで実行されるOracle Event Processingアプリケーションが、1つの入力イベント・ストリームを処理して出力イベントを生成します。

高可用性のシナリオ: アプリケーションがOracle Event Processing高可用性オプションを使用するように構成され、2つのサーバーで構成されるマルチサーバー・ドメインのデプロイメント・グループにデプロイされて、プライマリ・サーバーのみがイベントを出力します。

高可用性とスケーラビリティのシナリオ: 高可用性アプリケーションは、通知グループを定義するためにActiveActiveGroupBeanを使用するように構成されます。各通知グループには、単一の高可用性ユニットとして機能する複数のサーバーが含まれます。このシナリオでは、各通知グループ内のプライマリ・サーバーのみがイベントを出力します。通知グループ内のプライマリ・サーバーが万一機能しなくなった場合、Oracle Event Processingの高可用性フェイルオーバーが発生し、その通知グループ内のセカンダリ・サーバーが新しいプライマリを宣言して、構成するOracle Event Processing高可用性のサービス品質でイベントの出力を再開します。

詳細は、高可用性のあるパーティション化の構成を参照してください。

17.7 サービス品質オプションの選択

欠落イベントおよび複製イベントに対するアプリケーションの許容値と、期待されるイベント・スループットに適するサービス品質オプションを選択します。プライマリ・サーバーおよびセカンダリ・サーバーのハードウェア要件は、サービス品質がより正確になるほど上がるので注意してください。

表17-1に示すサービス品質オプションのいずれかを選択できます。

表17-1 Oracle Event Processing高可用性のサービス品質

高可用性オプション 欠落イベント? 重複イベント? パフォーマンス・オーバーヘッド

シンプル・フェイルオーバー

はい(多数)

はい(少数)

ごくわずか

バッファリングを使用するシンプル・フェイルオーバー

はい(少数)

はい(多数)

軽量キュー・トリミング

いいえ

はい(少数)

低-中

JMSによる正確なリカバリ

いいえ

いいえ

17.7.1 シンプル・フェイルオーバー

シンプル・フェイルオーバー高可用性のサービス品質は、最低のパフォーマンス・オーバーヘッド(リカバリ時間が速い)および最低のデータ整合性(フェイルオーバー時に欠落イベントと複製イベントの両方の可能性があります)によって特徴付けられます。

プライマリ・サーバーはイベントを出力し、セカンダリ・サーバーは出力イベントのバッファリングを行わないため、その出力イベントを破棄します。現在のアクティブ・プライマリで障害が発生した場合、通知されると新しいアクティブ・プライマリが選択され、出力イベントの送信を開始します。

フェイルオーバー中には、前のプライマリより前または後で稼働しているかに応じて、新しいプライマリによって多くのイベントが欠落したり複製されたりする場合があります。

フェイルオーバー・ウィンドウ中には、イベントが欠落する場合があります。たとえば、1秒当たり100個のイベントを処理してフェイルオーバーに10秒かかる場合、1000個のイベントが欠落します。

新しいプライマリ・サーバーは、ただちにPRIMARY状態に入ります。BECOMING_PRIMARY状態から新しいプライマリ・サーバーが遷移する前に満たす必要がある構成可能な準備状態のしきい値はありません。Oracle Event Processingサーバーがマルチサーバー・ドメインに再結合するとき、セカンダリとしてただちに利用可能になります。

この高可用性のサービス品質を実装するには、各出力アダプタの前に高可用性バッファリング出力アダプタを使用して(サイズがゼロのスライディング・ウィンドウを使用して)EPNを構成します。パフォーマンス・オーバーヘッドを削減するには、高可用性入力アダプタを使用せずに一部の着信イベント・プロパティを持つアプリケーション時間を使用します。

詳細は、シンプル・フェイルオーバーの構成を参照してください。

17.7.2 バッファリングを使用するシンプル・フェイルオーバー

バッファリングを使用するシンプル・フェイルオーバーの高可用性のサービス品質は、低いパフォーマンス・オーバーヘッド(リカバリ時間が速い)および向上したデータ整合性(フェイルオーバー時に欠落イベントはなくても多数の複製イベントの可能性があります)によって特徴付けられます。

プライマリ・サーバーはイベントを出力し、セカンダリ・サーバーはその出力イベントをバッファリングします。現在のアクティブ・プライマリで障害が発生した場合、通知されると新しいアクティブ・プライマリが選択され、出力イベントの送信を開始します。

フェイルオーバー・ウィンドウ中には、イベントが欠落する場合があります。たとえば、1秒当たり100個のイベントを処理してフェイルオーバーに10秒かかる場合、1000個のイベントが欠落します。セカンダリのバッファが大容量の場合、多数の複製が出力される可能性があります。一方、バッファが大容量になるほどメッセージの欠落の可能性は低くなります。

Oracle Event Processingサーバーがマルチサーバー・ドメインに再結合するとき、ご使用のアプリケーションがOracle Event Processing高可用性タイプ1アプリケーションの場合(アプリケーションが既存のセカンダリと完全に同一の出力イベントのシーケンスを出力する必要があります)、セカンダリとして利用できるようになる前にOracle Event Processingの高可用性出力アダプタに構成するwarm-up-window-lengthの時間を待機する必要があります。

この高可用性のサービス品質を実装するには、各出力アダプタの前にサイズがゼロより大きいスライディング・ウィンドウを使用し、高可用性バッファリング出力アダプタを使用してEPNを構成します。パフォーマンス・オーバーヘッドを削減するには、高可用性入力アダプタを使用せずに一部の着信イベント・プロパティを持つアプリケーション時間を使用します。

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

17.7.3 軽量キュー・トリミング

この高可用性のサービス品質は、低いパフォーマンス・オーバーヘッド(リカバリ時間が速い)および向上したデータ整合性(フェイルオーバー時に欠落イベントはなくても少数の複製イベントの可能性があります)によって特徴付けられます。

アクティブ・プライマリはセカンダリに通信し、イベントを実際に処理します。これによって、特定の時点でプライマリによって送信されていないイベントのみを含むようにセカンダリは出力イベントのバッファをトリミングできます。イベントは現在のプライマリによって送信された後でのみトリミングされるので、セカンダリによってフェイルオーバーの発生時に任意の出力イベントが欠落しないようにできます。

アクティブ・プライマリがキュー・トリミング・メッセージをアクティブ・セカンダリに送信する頻度は、次のように構成可能です。

  • n個のイベントごと(n>0)

    これによって、フェイルオーバー時に複製された出力イベントの数を最大n個に限定します。

  • nミリ秒ごと(n>0)

キュー・トリミング・アダプタには、アクティブ・プライマリおよびセカンダリの間で統一的にイベントを識別する方法が必要です。お薦めの方法は、イベントを識別するためにアプリケーション時間を使用することですが、一意にイベントを識別する任意のキー値が有効です。

キュー・トリミングの利点は、出力イベントが絶対に欠落しないことです。ただし、通信の必要があるトリミング・メッセージを送信するために、アクティブ・プライマリで若干のパフォーマンス・オーバーヘッドが発生します。このオーバーヘッドは、キュー・トリミング・メッセージの頻度が高くなるほど大きくなります。

フェイルオーバー中には、新しいプライマリがBECOMING_PRIMARY状態に入り、そのイベント・キュー(セカンダリとして累積していく)がフラッシュされるまで、PRIMARY状態には遷移しません。この遷移中には、新しい入力イベントがバッファリングされ、一部の複製イベントが出力される場合があります。

Oracle Event Processingサーバーがマルチサーバー・ドメインに再結合するとき、ご使用のアプリケーションがOracle Event Processing高可用性タイプ1アプリケーションの場合(アプリケーションが既存のセカンダリと完全に同一の出力イベントのシーケンスを出力する必要があります)、セカンダリとして利用できるようになる前にOracle Event Processingの高可用性出力アダプタに構成するwarm-up-window-lengthの時間を待機する必要があります。

この高可用性のサービス品質を実装するには、各入力アダプタおよび高可用性ブロードキャスト出力アダプタの後、各出力アダプタの前に、高可用性入力アダプタを使用してEPNを構成します。

詳細は、軽量キュー・トリミングの構成を参照してください。

17.7.4 JMSによる正確なリカバリ

JMSによる正確なリカバリの高可用性のサービス品質は、高パフォーマンス・オーバーヘッド(リカバリ時間が遅い)および最大のデータ整合性(フェイルオーバー時に欠落イベントも複製イベントもありません)によって特徴付けられます。この高可用性のサービス品質は、JMSの入力アダプタおよび出力アダプタにのみ対応します。

JMS高可用性のサービス品質を使用する正確なリカバリでは、シングルサーバーのイベント・パスに伴うトランザクションの保証は重視されず、サーバーのセットからの単一の出力が重視されます。保証を達成するため、セカンダリ・サーバーは、プライマリによってパブリッシュされるイベント・ストリームにJMS経由でリスニングします。図17-7は、この着信イベント・ストリームが、セカンダリが出力キューをトリミングするために使用する信頼できるキュー・トリミング・メッセージのソースであることを示します。JMSが信頼できる転送に構成されている場合、セカンダリで確認されるイベントのストリームは、正確にプライマリによって出力されるイベントのストリームであるため、フェイルオーバーは以前のプライマリ・サーバーによって転送されないイベントを新しいプライマリ・サーバーが正確に出力することを可能にします。

図17-7 JMSによる正確なリカバリ

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

フェイルオーバー中には、新しいプライマリ・サーバーがBECOMING_PRIMARY状態に入り、そのイベント・キュー(セカンダリとして累積していく)がフラッシュされるまで、PRIMARY状態には遷移しません。この遷移中には、新しい入力イベントがバッファリングされ、複製イベントは出力されません。

Oracle Event Processingサーバーがマルチサーバー・ドメインに再結合するとき、ご使用のアプリケーションがOracle Event Processing高可用性タイプ1アプリケーションの場合(アプリケーションが既存のセカンダリと完全に同一の出力イベントのシーケンスを出力する必要があります)、セカンダリ・サーバーとして利用できるようになる前にOracle Event Processingの高可用性出力アダプタに構成するwarm-up-window-lengthの時間を待機する必要があります。

JMSによる正確なリカバリの高可用性のサービス品質を実装するには、各入力アダプタおよび高可用性相関出力アダプタの後、各出力アダプタの前に、高可用性入力アダプタを使用してEPNを構成します。

スケーラビリティを向上するため、高可用性のサービス品質を持つクラスタ・グループBeanも使用できます。

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

17.8 高可用性のためのアプリケーション設計

高可用性のためのアプリケーションを設計する際には、ここで説明する主なユース・ケース、設計パターン、およびOracle CQL問合せの制約を考慮してください。

Oracle Event Processingの高可用性を宣言的に実装できますが、選択する高可用性のサービス品質から完全に利点を引き出すには、Oracle Event ProcessingアプリケーションがOracle Event Processingの提供する高可用性オプションを利用するように設計する必要があります。

17.8.1 プライマリ高可用性のユース・ケース

高可用性オプションは様々なOracle Event Processingアプリケーション設計に適応させることができますが、通常、Oracle Event Processingの高可用性は次のユース・ケースを想定して設計されています。

  • アプリケーションは1つ以上の外部システムから入力イベントを受信します。

  • 外部システムは、パブリッシュ/サブスクライブ・スタイルのシステムで、複数のアプリケーションのインスタンスが同時に接続し、同一のメッセージのストリームを受信することを可能にします。

  • アプリケーションは、複数のアプリケーションのコピーが同時に実行される場合、競合が発生しないように外部のシステムを更新しません。

  • アプリケーションは、出力イベントを外部のダウンストリーム・システムに送信します。複数のアプリケーションのインスタンスは、一度にメッセージを送信できるアプリケーションのインスタンスは1つのみですが、ダウンストリーム・システムに同時に接続できます。

このような制約では、次の異なるケースが注目されます。

  • アプリケーションは、障害の発生時に、一部の出力イベントのダウンストリーム・システムへの送信をスキップすることが許可されます。複製も許可されます。高可用性のサービス品質オプションとしてシンプル・フェイルオーバーを使用します。

  • アプリケーションは、複製イベントをダウンストリーム・システムに送信することを許可されますが、障害の発生時に任意のイベントをスキップすることは禁止されます。高可用性のサービス品質オプションとして、バッファリングを使用するシンプル・フェイルオーバー軽量キュー・トリミングを使用します。

  • アプリケーションは、障害の発生中にイベントが送信できない短い一時停止を法として、障害の発生時に完全に同一のメッセージ/イベントのストリームを送信する必要があります。高可用性のサービス品質オプションとしてJMSによる正確なリカバリを使用します。

17.8.2 高可用性の設計パターン

17.8.2.1 アプリケーションが許容できる最小の高可用性の選択

正確なリカバリの追加コスト(ステージごとのスループットは減少)がアプリケーションに実際に必要になることを確認してください。

17.8.2.2 すべての入口/出口ポイントでの高可用性コンポーネントの使用

各通常入力アダプタの後に入力アダプタを使用し、各通常出力アダプタの前に高可用性出力アダプタを使用します。

17.8.2.3 必要なものの保存

Oracle Event Processingシステムは、該当する少数のイベントを生成するために問い合せられる多数の生の入力イベントを受信します。通常、該当するイベントは数が少なく、より価値があるという理由から、それらを保存するのが合理的です。

17.8.2.4 Oracle Event Processingアプリケーションの状態の制限

Oracle Event Processingシステムによって、イベントのウィンドウを問い合せることができます。きわめて大きいウィンドウを使用してシステムを構築することは魅力的ですが、障害の発生時に再構築の必要がある状態が増加します。通常、このような技術の高可用性ファシリティを活用するために、長期状態は分散型キャッシュやデータベースのような安定したストレージに保存されるとみなす方が良さそうです。

17.8.2.5 適切なwarm-up-window-length時間の選択

新しいOracle Event Processingサーバーが高可用性マルチサーバー・ドメインに追加される場合、または既存の障害が発生したサーバーが再起動する場合、サーバーは、サーバーにデプロイされたすべてのアプリケーションが完全に結合するまで、Oracle Event Processing高可用性デプロイメントと通知グループを完全には結合しません。いつ完全に結合するかは、アプリケーションの種類によって異なります。

Oracle Event Processingの高可用性アプリケーションは、表17-2で示すように、タイプ1またはタイプ2のアプリケーションとして記述されます。

表17-2 Oracle Event Processingの高可用性アプリケーションの種類

アプリケーション・タイプ 出力イベントの完全に同一のシーケンスを生成する必要があるか? 有限の期間内に入力ストリームを処理することによって内部状態を再構築できる必要があるか? 完全に結合する前にこの期間を待機する必要があるか?

タイプ1

はい

はい

はい

タイプ2

いいえ

いいえ

いいえ

詳細は、高可用性マルチサーバー・ドメインの再結合を参照してください。

17.8.2.5.1 タイプ1アプリケーション

タイプ1アプリケーションは、高可用性デプロイメントおよび通知グループに完全に結合すると、新しいセカンダリが既存のセカンダリ・サーバーと完全に同一の出力イベントのシーケンスを生成するように要求します。

タイプ1アプリケーションは、アプリケーションを実行している他のセカンダリ・サーバーと完全に同一の出力イベントのストリームを生成した後で、有限の期間(warm-up-window-lengthの時間)にその入力ストリームを処理することによって、内部状態を再構築する必要があります。

高可用性出力アダプタ上で、warm-up-window-lengthの時間を構成します。warm-up-window-lengthの時間の長さは、秒または分単位で指定します。たとえば、アプリケーションに5分、7分、15分の範囲をベースとするウィンドウを持つOracle CQL問合せが含まれる場合、最小のwarm-up-window-length時間は15分(最大の範囲をベースとするウィンドウ・サイズ)となります。Oracleは、必要な状態が利用可能であることを保証するために数分の値を持つ最大ウィンドウ長もお薦めします。そのため先の例では17分または20分がwarm-up-window-length時間に適した長さとなります。

サーバーは、warm-up-window-lengthの期間中はシステム時間を使用するため、サーバー時間は処理中のイベントに関連したアプリケーション時間には直接関連付けられません。

タイプ1アプリケーションは、有限の期間中に発生したイベントのみを対象とします。すべての範囲をベースとするOracle CQLウィンドウは、warm-up-window-length時間よりも短縮する必要があり、タプルベースのウィンドウが時間によって条件を付けられる必要があります。たとえば、アプリケーションは、直近の10個のイベントが直近の5分間に発生した場合、それらのイベントのみを問い合せます。このプロパティを持たないアプリケーションは、タイプ1アプリケーションではありえずwarm-up-window-lengthの期間を使用できません。

たとえば、時間の条件を持たないタプルベースでパーティション化されたウィンドウを使用するアプリケーションは、任意の時間量がウィンドウの状態の再構築に必要となるためwarm-up-window-lengthを使用できません。

タイプ1アプリケーションが高可用性ブロードキャスト出力アダプタを使用する場合、一意のアプリケーション専用キーまたはアプリケーション時間のようなモノトニックなキーを使用することによって、イベントをトリミングできます。アプリケーション時間を使用してイベントをトリミングすることは、出力イベントが生成されない可能性があるアプリケーションにおいて、堅牢性が増すとともに不具合への脆弱性が低下するためお薦めです。

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

17.8.2.5.2 タイプ2アプリケーション

タイプ2アプリケーションは、高可用性デプロイメントおよび通知グループに完全に結合すると、新しいセカンダリ・サーバーが既存のセカンダリ・サーバーと同一の出力イベントのシーケンスを生成するように要求しません。新しいクラスタ・メンバーが、入力イベントの処理を開始する時点に関して有効な出力イベントを生成するように要求するのみです。

タイプ2アプリケーションはwarm-up-window-length期間を要求しません。

大半のアプリケーションは、タイプ2アプリケーションです。アプリケーションが任意の時点で(プライマリOracle Event Processingサーバー上で)起動し、その時点で入力ストリームからイベントの処理を開始して、有効な出力イベントを生成することが多くあります。アプリケーションの起動中は入力ストリームが一時停止されず、入力イベントは常に生成されて受信します。多くの場合、若干異なるタイミングで同じ処理を実行するセカンダリ・ステージでも、アプリケーションの観点から見れば有効な出力イベントが生成されると想定できますが、タイミングのわずかな違いのために、プライマリ・サーバーによって生成されるイベントと同一とはかぎりません。

たとえば、金融市場が開いている間のみ実行される金融アプリケーションは、次のようにタイプ2のアプリケーションとして動作できます。すべてのサーバーは市場が開く前に起動し、市場データ・ストリームにおける同じ時点で着信イベントの処理を開始します。障害に備えるために複数のセカンダリ・サーバーを実行できますが、市場が開いている間セカンダリ・サーバーの数が十分な場合には、障害が発生するセカンダリ・サーバーを再起動したり、セカンダリ・サーバーを追加しないでください。これは、どのセカンダリ・サーバーも状態をリカバリする必要がないためです。

17.8.2.6 アプリケーションが多重呼出し不変であることの保証

異なるサーバー上でアプリケーションの2つのコピーを実行でき、そのコピーは共有されたキャッシュやデータベースで競合しません。外部のリレーション(キャッシュや表など)を使用する場合、サーバーがクラスタに再結合するとき、アプリケーションは以前と同一のキャッシュや表にアクセスします。アプリケーションは同一の外部リレーションに再結合する必要があります。データが必ず同一のデータ・ソースから抽出されるように、サーバー上のデータ・ソースは変更しないでください。

17.8.2.7 外部のソース・イベント・アイデンティティ

多くの高可用性ソリューションでは、異なるサーバー間でイベントの関連付けが必要です。イベントを関連付けるには、イベントをユニバーサルに識別可能にする必要があります。イベントをユニバーサルに識別可能にする最適な方法は、外部情報、可能であればタイムスタンプを使用してイベントにシードすることです。詳細は、アプリケーション時間の優先を参照してください。

17.8.2.8 イベント順序の重要性の理解

プライマリおよびセカンダリのサーバーは、キュー・トリミングおよび同等ベースのイベント識別子(継続的に増加しない、モノトニックではないイベント識別子)を使用する高可用性のサービス品質オプションを選択する場合、同一の出力イベントを完全に同一の順序で生成する必要があります。異なる順序で出力イベントを生成すると、障害の発生時に出力イベントが欠落したり、出力イベントが不要に重複したりする可能性があります。

図17-8で示される出力イベント・ストリームを検討してください。プライマリ・サーバーは、出力イベントab、およびcを持ちます。イベントcを出力後、プライマリはセカンダリにキュー・トリミング・メッセージを送信します。

セカンダリ・サーバーは、イベントc自体を含むイベントcの前に生成されたキュー内のすべてのイベントをトリミングします。この場合、イベント・セットは{a, b, e, d, c}となり、これらはプライマリ・サーバーがイベントdおよびeをまだ出力していないため適切ではありません。イベントcのトリミング・メッセージの処理後にフェイルオーバーが発生する場合、イベントは失われます。

17.8.2.8.1 確定的動作の優先

複数のインスタンス上で実行される場合、アプリケーションが同一の順序でイベントを生成するためには、確定している必要があります。アプリケーションは次の要素に依存させないでください。

  • 異なるマシン上に異なる結果を返す可能性がある乱数ジェネレータ。

  • System.getTimeMillisまたはSystem.nanoTimeなどのメソッド。これらはシステム・クロックが同期されていないため、異なるマシン上で異なる結果を返す可能性があります。

17.8.2.8.2 マルチスレッドの回避

スレッド・スケジューリング・アルゴリズムは時間への依存度がきわめて高いため、マルチスレッドはアプリケーション内で非確定的なソースとなります。異なるスレッドは、異なるマシン上および異なる時間でスケジューリングできます。

たとえば、複数のスレッドが高可用性アダプタに並列にイベントを送信するEPNを作成しないでください。そのようなチャネルが高可用性アダプタのイベント・ソースの場合、イベントが異なるスレッドごとに並列にアダプタに送信されるようになり、イベント順序を非確定的にすることができる可能性があります。また、複数のスレッドを持つメディエータ(JMSサーバー)はイベントを送信しないでください。このメディエータはイベント・ソースとして機能します。

避ける必要があるチャネル構成に関する詳細は、次を参照してください。

  • 『Oracle Event Processingのカスタマイズ』の構成ファイルの要素およびプロパティに関する項

  • Oracle Event Processingのスキーマ・リファレンスのmax-threads

17.8.2.8.3 モノトニックなイベント識別子の優先

イベント識別子はモノトニックまたは非モノトニックにできます。モノトニックな識別子は、継続的に増加する識別子です(時間値など)。非モノトニックな識別子は、継続的に増加せず、重複を含む可能性があります。

通常、アプリケーションの設計時にはモノトニックなイベント識別子を指定します。モノトニックなイベント識別子を使用すると、Oracle Event Processingの高可用性アダプタは順序どおりでないイベントを生成する可能性があるアプリケーションを処理できます。

17.8.2.9 高可用性を考慮したOracle CQL問合せの記述

Oracle Event Processingの高可用性を使用するとき、Oracle CQLの問合せの使用方法がすべてサポートされるわけではありません。この制約を解決するには、Oracle CQLの問合せを再定義する必要があります。詳細は、「Oracle CQLの問合せの制約」を参照してください。

17.8.2.10 サーバーのカップリングの回避

Oracle Event Processingシステムで高可用性のパフォーマンスが最も高くなるのは、サーバーが調整を必要とせずに実行できるときです。通常、共有状態が存在せず、ダウンストリーム・システムが複製を許容する場合にこれは実行できます。高可用性のレベルを上げることは、ダウンストリーム・システムが確認するイベント・ストリームの忠実度を上げることを目標としますが、忠実度を上げることはパフォーマンスのペナルティを伴います。

17.8.2.11 サーバー・リカバリの計画

セカンダリ・サーバーがマルチサーバー・ドメインに再結合するときには、現在のプライマリとアクティブ・セカンダリが一致するようにアプリケーション状態を再構築する時間が必要です。適切なwarm-up-window-length時間の選択を参照してください。

マルチサーバー・ドメインに再結合した後に、セカンダリ・サーバーがアクティブ・セカンダリ・サーバーとして利用可能になるためにかかる時間が、要求するアクティブ・セカンダリ・サーバーの数における要因となります。

準備完了前にセカンダリが新しいプライマリ・サーバーになることを宣言される場合、セカンダリ・サーバーは例外をスローします。

17.8.3 Oracle CQLの問合せの制約

高可用性アプリケーションでは、Oracle CQL問合せに次のような制約があります。Oracle CQLと、この項で取り上げているトピックの詳細は、『Oracle Event Processing Oracle CQL言語リファレンス』の問合せに関する項を参照してください。

17.8.3.1 範囲ベースのウィンドウ

タイプ1アプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があり、すべての範囲ベースのOracle CQLウィンドウは、warm-up-window-lengthの時間よりも短くする必要があります。「適切なwarm-up-window-length時間の選択」を参照してください。

チャネルは、Oracle CQLの問合せが範囲ベースのウィンドウを含む場合にアプリケーション時間を使用する必要があります。アプリケーション時間の優先を参照してください。

17.8.3.2 タプルベースのウィンドウ

タイプ1アプリケーションでは、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要があり、すべてのタプルベースのウィンドウは、時間によって条件が付けられる必要があります。「適切なwarm-up-window-length時間の選択」を参照してください。

17.8.3.3 パーティション化されたウィンドウ

パーティションを再構築できない場合があるため、パーティション化されたウィンドウは避けてください。パーティション化されたウィンドウを使用する場合、Oracle Event Processingサーバーの時間がパーティションを再構築するのに十分な長さとなるようにwarm-up-window-lengthを構成します。「適切なwarm-up-window-length時間の選択」を参照してください。

17.8.3.4 スライディング・ウィンドウ

マルチサーバー・ドメインに結合する新しいステージが、既存のステージと完全に同一の出力イベントを生成すると想定される場合、Oracle CQL問合せでスライディング・ウィンドウは使用しないでください。高可用性マルチサーバー・ドメインの再結合を参照してください。

17.8.3.5 DURATION句および非イベント検出

Oracle CQLの問合せが非イベント検出のDURATION句を含む場合、アプリケーション時間を使用する必要があります。「アプリケーション時間の優先」を参照してください。

17.8.3.6 アプリケーション時間の優先

Oracle Event Processingでは、各イベントはイベントの発生時点で関連付けられます。Oracle CQLは次の2種類を認識します。

  • アプリケーション時間: イベントがOracle CQLプロセッサに入る前に、アプリケーションによってOracle CQLの外で各イベントに割り当てられた時間値です。

  • システム時間: System.nanoTime()を必ずコールすることによって、Oracle CQLプロセッサに到着時にイベントに関連付けられる時間値です。

アプリケーション時間は、通常、アプリケーションの高可用性のために必要な最善の選択です。アプリケーション時間は、ダウンストリームにイベントが送信される前にイベントに関連付けられるため、アクティブなプライマリおよびセカンダリ・サーバーの全体に渡って整合性があります。

システム時間は、システム・クロックが同期されていないことによって、イベントに関連付けられた時間値が各サーバーで異なる可能性があるためアプリケーションのインスタンスに異なる結果を生成させます。Oracle CQLの問合せが時間ベースのウィンドウを使用しない場合、アプリケーションにシステム時間を使用できます。イベントベースのウィンドウのみ使用するアプリケーションは、受信時間ではなくイベントを受信した順番に依存するためこの場合はシステム時間を使用できます。

時間ベースのウィンドウを使用するOracle CQLの問合せに関してシステム時間を使用する必要がある場合は、特別なOracle Event Processingの高可用性入力アダプタを使用する必要があります。このアダプタは、着信イベントを補足し、プライマリおよびセカンダリ・サーバーのインスタンス全体に渡る統一的な時間を割り当てます。

17.9 高可用性のサービス品質の構成

アセンブリおよびコンポーネント構成ファイルで、Oracle Event Processingの高可用性のサービス品質を構成します。

Oracle Event Processingの高可用性の構成に変更を加えた後は、Oracle Event Processingアプリケーションを再デプロイする必要があります。

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

17.9.1 シンプル・フェイルオーバーの構成

スライディング・ウィンドウのサイズをゼロ(0)に設定して、Oracle Event Processing高可用性バッファリング出力アダプタを使用してシンプル・フェイルオーバーを構成します。

この手順は、図17-9で示すEPNの例から始まり、シンプル・フェイルオーバー用に構成するために必要なコンポーネントを加えていきます。

図17-9 シンプル・フェイルオーバーのEPN

図17-9の説明が続きます
「図17-9 シンプル・フェイルオーバーのEPN」の説明

シンプル・フェイルオーバーの構成:

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

    詳細は、『Oracle Event Processingの管理』のマルチサーバーの管理に関する項を参照してください。

  2. Oracle Event Processingアプリケーションを作成します。
  3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。
    • com.bea.wlevs.ede.api.cluster

    • com.oracle.cep.cluster.hagroups

    • com.oracle.cep.cluster.ha.adapter

    • com.oracle.cep.cluster.ha.api

  4. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次のアセンブリ・ファイル・エントリで示すように、Oracle Event Processingの高可用性バッファリング出力アダプタを追加します。
    • チャネルhelloworldOutputChannelの後に、providerha-bufferingに設定したwlevs:adapter要素を追加します。

    • idごとにha-bufferingアダプタを参照するように、チャネルhelloworldOutputChannelwlevs:listener要素を更新します。

    • wlevs:listener要素を、HelloWorldBeanクラスを参照するha-bufferingアダプタに追加します。

    <wlevs:event-type-repository>
      <wlevs:event-type type-name="HelloWorldEvent">            <wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent
        </wlevs:class>
      </wlevs:event-type>
    </wlevs:event-type-repository>
    
    <wlevs:adapter id="helloworldAdapter" 
      class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
    <wlevs:instance-property name="message" value="HelloWorld - 
      the current time is:"/>
    </wlevs:adapter>
    
    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
    </wlevs:channel>
    
    <wlevs:processor id="helloworldProcessor" />
    
    <wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
      advertise="true">
      <wlevs:listener ref="myHaSlidingWindowAdapter"/>
      <wlevs:source ref="helloworldProcessor"/>
     </wlevs:channel>
    
     <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
       <wlevs:listener>
         <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
       </wlevs:listener>
     </wlevs:adapter>
    
  5. オプションで、入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、アセンブリ・ファイル・エントリで示すように、適切なイベント・プロパティに基づいてアプリケーションのタイムスタンプを構成します。

    シンプル・フェイルオーバーの場合、イベントはサーバー間で相関関係を持たないためシステムのタイムスタンプを使用できます。ただし、アプリケーションのタイムスタンプが使用されない場合、若干異なる結果がバッファから出力される可能性があります。

    この例では、イベント・プロパティarrivalTimeが使用されます。

    wlevs:expressionをこのイベント・プロパティに設定する必要があります。

    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
       <wlevs:listener ref="helloworldProcessor"/>
       <wlevs:source ref="myHaInputAdapter"/>
       <wlevs:application-timestamped>
          <wlevs:expression>arrivalTime</wlevs:expression>
       </wlevs:application-timestamped>
     </wlevs:channel>
    
  6. Oracle Event Processingの高可用性バッファリング出力アダプタを構成します。

    インスタンス・プロパティwindowLengthを、次に示すようにゼロ(0)に設定します。

    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
       <wlevs:listener>
         <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
       </wlevs:listener>
       <wlevs:instance-property name="windowLength" value="0"/>
    </wlevs:adapter>
    
    
  7. オプションで、コンポーネント構成ファイルを次に示すように、Oracle Event Processingの高可用性バッファリング出力アダプタを含むように構成します。
    <processor>
      <name>helloworldProcessor</name>
      <rules>
        <query id="helloworldRule">
          <![CDATA[ select * from helloworldInputChannel [Now] >
        </query>
      </rules>
    </processor>
    
    <ha:ha-buffering-adapter >
      <name>myHaSlidingWindowAdapter</name>
      <window-length>0</window-length>
    </ha:ha-buffering-adapter >
    
    
  8. ステップ1で作成したデプロイメント・グループにアプリケーションをデプロイします。

    Oracle Event Processingは、Oracle Event Processingサーバーのいずれかをプライマリとして自動的に選択します。

17.9.2 バッファリングを使用するシンプル・フェイルオーバーの構成

スライディング・ウィンドウのサイズをゼロ(0)より大きく設定して、Oracle Event Processingバッファリング出力アダプタを使用してシンプル・フェイルオーバーを構成します。

この手順は、図17-10で示すEPNの例から始まり、バッファリングを使用するシンプル・フェイルオーバー用に構成するために必要なコンポーネントを加えていきます。

図17-10 バッファリングEPNを使用するシンプル・フェイルオーバー

図17-10の説明が続きます
「図17-10 バッファリングEPNを使用シンプル・フェイルオーバー」の説明

バッファリングを使用するシンプル・フェイルオーバーの構成:

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

    詳細は、『Oracle Event Processingの管理』のマルチサーバーの管理に関する項を参照してください。

  2. Oracle Event Processingアプリケーションを作成します。
  3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。
    • com.bea.wlevs.ede.api.cluster

    • com.oracle.cep.cluster.hagroups

    • com.oracle.cep.cluster.ha.adapter

    • com.oracle.cep.cluster.ha.api

  4. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次のアセンブリ・ファイル・エントリで示すように、Oracle Event Processingの高可用性バッファリング出力アダプタを追加します。
    • チャネルhelloworldOutputChannelの後に、providerha-bufferingに設定したwlevs:adapter要素を追加します。

    • idごとにha-bufferingアダプタを参照するように、チャネルhelloworldOutputChannelwlevs:listener要素を更新します。

    • wlevs:listener要素を、HelloWorldBeanクラスを参照するha-bufferingアダプタに追加します。

    <wlevs:event-type-repository>
      <wlevs:event-type type-name="HelloWorldEvent">
         <wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</wlevs:class>
      </wlevs:event-type>
    </wlevs:event-type-repository>
    
    <wlevs:adapter id="helloworldAdapter" 
      class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
      <wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
    </wlevs:adapter>
    
    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
    </wlevs:channel>
    
    <wlevs:processor id="helloworldProcessor" />
    
    <wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent" advertise="true">
       <wlevs:listener ref="myHaSlidingWindowAdapter"/>
       <wlevs:source ref="helloworldProcessor"/>
    </wlevs:channel>
    
    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
      <wlevs:listener>
         <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
      </wlevs:listener>
    </wlevs:adapter>
    
  5. オプションで、入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、次に示すように適切なイベント・プロパティに基づいてアプリケーションのタイムスタンプを構成します。

    バッファリングを使用するシンプル・フェイルオーバーの場合、イベントはサーバー間で相関関係を持たないため、システムのタイムスタンプを使用できます。ただし、アプリケーションのタイムスタンプが使用されない場合、若干異なる結果がバッファから出力される可能性があります。

    この例では、イベント・プロパティarrivalTimeが使用されます。

    wlevs:expressionをこのイベント・プロパティに設定する必要があります。

    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
      <wlevs:source ref="myHaInputAdapter"/>
      <wlevs:application-timestamped>
        <wlevs:expression>arrivalTime</wlevs:expression>
      </wlevs:application-timestamped>
    </wlevs:channel>
    
  6. Oracle Event Processingの高可用性バッファリング出力アダプタを構成します。

    インスタンス・プロパティwindowLengthを、次に示すようにゼロ(0)より大きい値に設定します。

    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-buffering" >
      <wlevs:listener>
        <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
      </wlevs:listener>
         <wlevs:instance-property name="windowLength" value="15000"/>
    </wlevs:adapter>
    
  7. オプションで、コンポーネント構成ファイルを次に示すように、Oracle Event Processingの高可用性バッファリング出力アダプタを含むように構成します。
    <processor>
      <name>helloworldProcessor</name>
      <rules>
        <query id="helloworldRule">
          <![CDATA[ select * from helloworldInputChannel [Now] >
        </query>
      </rules>
    </processor>
    
    <ha:ha-buffering-adapter >
      <name>myHaSlidingWindowAdapter</name>
      <window-length>15000</window-length>
    </ha:ha-buffering-adapter >
    
    
  8. アプリケーションが、Oracle Event Processingの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、バッファリング出力アダプタのwarm-up-window-lengthを構成します。

    詳細は、適切なwarm-up-window-length時間の選択を参照してください。

  9. ステップ1で作成したデプロイメント・グループにアプリケーションをデプロイします。

    Oracle Event Processingは、Oracle Event Processingサーバーのいずれかをプライマリとして自動的に選択します。

17.9.3 軽量キュー・トリミングの構成

Oracle Event Processingの高可用性入力アダプタおよびブロードキャスト出力アダプタを使用して、軽量キュー・トリミングを構成します。

この手順は、図17-11で示すEPNの例から始まり、軽量キュー・トリミング用に構成するために必要なコンポーネントを加えていきます。

図17-11 軽量キュー・トリミングのEPN

図17-11の説明が続きます
「図17-11 軽量キュー・トリミングのEPN」の説明

軽量キュー・トリミングの構成:

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

    詳細は、『Oracle Event Processingの管理』のマルチサーバーの管理に関する項を参照してください。

  2. Oracle Event Processingアプリケーションを作成します。
  3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。
    • com.bea.wlevs.ede.api.cluster

    • com.oracle.cep.cluster.hagroups

    • com.oracle.cep.cluster.ha.adapter

    • com.oracle.cep.cluster.ha.api

  4. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次の例に示すように、Oracle Event Processingの高可用性入力アダプタを追加します。
    • 通常の入力アダプタhelloworldAdapterの後に、providerha-inboundに設定したwlevs:adapter要素を追加します。

    • wlevs:listener要素を、idごとにha-inboundアダプタを参照する通常の入力アダプタhelloworldAdapterに追加します。

    • wlevs:source要素を、idごとにha-inboundアダプタを参照するhelloworldInputChannelに追加します。

        <wlevs:event-type-repository>
            <wlevs:event-type type-name="HelloWorldEvent">
                <wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent</wlevs:class>
      </wlevs:event-type>
    </wlevs:event-type-repository>
    
    <wlevs:adapter id="helloworldAdapter" 
      class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
    <wlevs:instance-property name="message" value="HelloWorld - 
      the current time is:"/>
       <wlevs:listener ref="myHaInputAdapter"/>
    </wlevs:adapter>
    
    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
    </wlevs:adapter>
    
    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
      <wlevs:source ref="myHaInputAdapter"/>
    </wlevs:channel>
    
    <wlevs:processor id="helloworldProcessor" />
    
    <wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent"
      advertise="true">
      <wlevs:listener>
        <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
      </wlevs:listener>
        <wlevs:source ref="helloworldProcessor"/>
      </wlevs:channel>
    
  5. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次に示すように、Oracle Event Processingの高可用性ブロードキャスト出力アダプタを追加します。
    • チャネルhelloworldOutputChannelの後に、providerha-broadcastに設定したwlevs:adapter要素を追加します。

    • idごとにha-broadcastアダプタを参照するように、チャネルhelloworldOutputChannelwlevs:listener要素を更新します。

    • wlevs:listener要素を、HelloWorldBeanクラスを参照するha-broadcastアダプタに追加します。

    <wlevs:event-type-repository>
      <wlevs:event-type type-name="HelloWorldEvent">
        <wlevs:class>com.bea.wlevs.event.example.helloworld.HelloWorldEvent
        </wlevs:class>
      </wlevs:event-type>
    </wlevs:event-type-repository>
    
    <wlevs:adapter id="helloworldAdapter" 
       class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
     <wlevs:instance-property name="message" value="HelloWorld - 
        the current time is:"/>
      <wlevs:listener ref="myHaInputAdapter"/>
    </wlevs:adapter>
    
    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
    </wlevs:adapter>
    
    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
      <wlevs:source ref="myHaInputAdapter"/>
    </wlevs:channel>
    
    <wlevs:processor id="helloworldProcessor" />
    
    <wlevs:channel id="helloworldOutputChannel" event-type="HelloWorldEvent" 
      advertise="true">
      <wlevs:listener ref="myHaBroadcastAdapter"/>
      <wlevs:source ref="helloworldProcessor"/>
    </wlevs:channel>
    
    <wlevs:adapter id="myHaBroadcastAdapter" provider="ha-broadcast" >
      <wlevs:listener>
        <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
      </wlevs:listener>
    </wlevs:adapter>
    
  6. Oracle Event Processingの高可用性入力アダプタを構成します。

    次の構成例のいずれかを使用することを検討します。

    この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

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

    この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。イベントはタプル・ベースのイベントであるため、eventTypeプロパティを使用してイベント型(MyEventType)を指定する必要があります。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
       <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
       <wlevs:instance-property name="eventType" value="MyEventType"/>
    </wlevs:adapter>

    この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(idという名前)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

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

    この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(orderIDおよびaccountIDプロパティ)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
      <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
      <wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
    </wlevs:adapter>
    

    複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装を例に示します。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Event Processingは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

    package com.acme;
    
    public class MyCompoundKeyClass {
        private int orderID;
        private int accountID;
    
        public MyCompoundKeyClass() {}
    
        public int getOrderID() {
            return orderID;
        }
        public setOrderID(int orderID) {
            this.orderID = orderID;
        }
        public int getAccountID() {
            return accountID;
        }
        public setOrderID(int accountID) {
            this.accountID = accountID;
        }
    
        public int hashCode() {
        int hash = 1;
        hash = hash * 31 + orderID.hashCode();
        hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
        return hash;
        }
    
        public boolean equals(Object obj) {
            if (obj == this) return true;
            if (obj == null) return false;
            if (!(obj instanceof MyCompoundKeyClass)) return false;
            MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
            return k.accountID == accountID && k.orderID == orderID;
        }
    }
  7. 高可用性入力アダプタ(helloworldInputChannel)からのチャネル・ダウンストリームを構成し、次の例で示される高可用性入力アダプタのtimeProperty設定に基づいて、アプリケーションのタイムスタンプを構成します。

    wlevs:expressiontimePropertyの値に設定する必要があります。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
       <wlevs:instance-property name="keyProperties" value="id"/>
       <wlevs:instance-property name="eventType" value="HelloWorldEvent"/>
       <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
    </wlevs:adapter>
    
    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
      <wlevs:listener ref="helloworldProcessor"/>
      <wlevs:source ref="myHaInputAdapter"/>
      <wlevs:application-timestamped>
        <wlevs:expression>arrivalTime</wlevs:expression>
      </wlevs:application-timestamped>
    </wlevs:channel>
    
  8. Oracle Event Processingの高可用性ブロードキャスト出力アダプタを構成します。

    次の構成例のいずれかを使用することを検討します。

    この例は、すべてのデフォルトを使用したブロードキャスト出力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、キーの値は非モノトニック(継続的に増加しません)かつ全体順序(一意)です。

    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
       <wlevs:listener>
          <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
       </wlevs:listener>
    </wlevs:adapter>

    この例は、ブロードキャスト出力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(timePropertyという名前)に基づいており、キーの値はモノトニック(継続的に増加します)かつ全体順序ではありません(一意ではありません)。

    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
       <wlevs:listener>
         <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
       </wlevs:listener>
         <wlevs:instance-property name="keyProperties" value="timeProperty"/>
         <wlevs:instance-property name="monotonic" value="true"/>
         <wlevs:instance-property name="totalOrder" value="false"/>
      </wlevs:adapter>

    この例は、ブロードキャスト出力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(timePropertyおよびaccountIDプロパティ)に基づいており、キーの値はモノトニック(継続的に増加します)かつ全体順序(一意)です。

    <wlevs:adapter id="myHaSlidingWindowAdapter" provider="ha-broadcast" >
     <wlevs:listener>
        <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
      </wlevs:listener>
      <wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
      <wlevs:instance-property name="monotonic" value="true"/>
      <wlevs:instance-property name="totalOrder" value="true"/>
    </wlevs:adapter>
    

    複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装は次の例で示されます。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Event Processingは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

    package com.acme;
    
    public class MyCompoundKeyClass {
        private int timeProperty;
        private int accountID;
    
        public MyCompoundKeyClass() {}
    
        public int getTimeProperty() {
            return orderID;
        }
        public setTimeProperty(int timeProperty) {
            this.timeProperty = timeProperty;
        }
        public int getAccountID() {
            return accountID;
        }
        public setOrderID(int accountID) {
            this.accountID = accountID;
        }
    
        public int hashCode() {
        int hash = 1;
        hash = hash * 31 + timeProperty.hashCode();
        hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
        return hash;
        }
    
        public boolean equals(Object obj) {
            if (obj == this) return true;
            if (obj == null) return false;
            if (!(obj instanceof MyCompoundKeyClass)) return false;
            MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
            return k.accountID == accountID && k.orderID == orderID;
        }
    }
    
  9. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Event Processingの高可用性入力アダプタおよびバッファリング出力アダプタを含むように構成します。
    <processor>
      <name>helloworldProcessor</name>
      <rules>
        <query id="helloworldRule">
          <![CDATA[ select * from helloworldInputChannel [Now] >
        </query>
      </rules>
    </processor>
    
    <ha:ha-inbound-adapter>
     <name>myHaInputAdapter</name>
    </ha:ha-inbound-adapter>
     
    <ha:ha-broadcast-adapter>
      <name>myHaBroadcastAdapter</name>
      <trimming-interval units="events">10</trimming-interval>
    </ha:ha-broadcast-adapter>
    
  10. アプリケーションが、Oracle Event Processingの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、ブロードキャスト出力アダプタのwarm-up-window-lengthを構成します。
  11. Oracle Event Processingは、Oracle Event Processingサーバーのいずれかをプライマリとして自動的に選択します。

17.9.4 JMSによる正確なリカバリの構成

Oracle Event Processingの高可用性入力アダプタおよび相関出力アダプタを使用して、JMSによる正確なリカバリを構成します。

この手順では、図17-12が示すEPNの例を作成する方法を説明します。このOracle Event Processingの高可用性のサービス品質に関する詳細は、「JMSによる正確なリカバリ」を参照してください。

注:

正確なリカバリのためにJMSアダプタによって使用されるJMS宛先は、キューではなくトピックである必要があります。

図17-12 JMSのEPNによる正確なリカバリ

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

JMSによる正確なリカバリの構成

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

    詳細は、『Oracle Event Processingの管理』のマルチサーバーの管理に関する項を参照してください。

  2. Oracle Event Processingアプリケーションを作成します。
  3. MANIFEST.MFファイルを編集し、次のImport-Packageエントリを追加します。
    • com.bea.wlevs.ede.api.cluster

    • com.oracle.cep.cluster.hagroups

    • com.oracle.cep.cluster.ha.adapter

    • com.oracle.cep.cluster.ha.api

  4. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次に示すように、Oracle Event Processingの高可用性入力アダプタを追加します。
    • 通常の入力アダプタJMSInboundAdapterの後に、providerha-inboundに設定したwlevs:adapter要素を追加します。

    • wlevs:listener要素を、idごとにha-inboundアダプタを参照する通常の入力アダプタJMSInboundAdapterに追加します。

    • wlevs:source要素を、idごとにha-inboundアダプタを参照するチャネルchannel1に追加します。

        <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:adapter>
    
        <wlevs:channel id="channel1" event-type="StockTick">
            <wlevs:listener ref="processor1" />
            <wlevs:source ref="myHaInputAdapter"/>
        </wlevs:channel>
    
  5. Oracle Event ProcessingアプリケーションのEPNアセンブリ・ファイルを構成し、次に示すように、Oracle Event Processingの高可用性相関出力アダプタを追加します。
    • チャネルchannel2の後に、providerha-correlatingに設定したwlevs:adapter要素を追加します。

    • idごとにha-correlatingアダプタを参照するように、チャネルchannel2wlevs:listener要素を更新します。

    • wlevs:listener要素を、JMSOutboundAdapterクラスを参照するha-correlatingアダプタに追加します。

    <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:adapter>
    
    <wlevs:channel id="channel1" event-type="StockTick">
      <wlevs:listener ref="processor1" />
      <wlevs:source ref="myHaInputAdapter"/>
    </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:listener ref="JMSOutboundAdapter"/>
    </wlevs:adapter>
    
    <wlevs:adapter id="JMSOutboundAdapter" provider="jms-outbound">
    </wlevs:adapter>
    
  6. Oracle Event Processingの高可用性入力アダプタを構成します。

    次の構成例のいずれかを使用することを検討します。

    この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

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

    この例は、すべてのデフォルトを使用した高可用性入力アダプタの構成を示します。必須キーはすべてのイベント・プロパティに基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。イベントはタプル・ベースのイベントであるため、eventTypeプロパティを使用してイベント型(MyEventType)を指定する必要があります。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
      <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
      <wlevs:instance-property name="eventType" value="MyEventType"/>
    </wlevs:adapter>

    この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーはイベント・プロパティ(sequenceNoという名前)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、inboundTimeという名前のイベント・プロパティです。

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

    この例は、高可用性入力アダプタの構成を示します。ここでは、必須キーは1つ以上のイベント・プロパティ(orderIDおよびaccountIDプロパティ)に基づいており、高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティは、arrivalTimeという名前のイベント・プロパティです。

    複合キーのJavaクラス(com.acme.MyCompoundKeyClass)は必須で、その実装を例に示します。hashCodeおよびequalsメソッドが必要になります。keyClassを指定するとき、keyPropertiesインスタンス・プロパティは無視されます。Oracle Event Processingは、複合キーがkeyClass内のすべてのゲッター・メソッドに基づくと仮定します。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
      <wlevs:instance-property name="timeProperty" value="arrivalTime"/>
      <wlevs:instance-property name="keyClass" value="com.acme.MyCompoundKeyClass"/>
    </wlevs:adapter>
    package com.acme;
    
    public class MyCompoundKeyClass {
        private int orderID;
        private int accountID;
    
        public MyCompoundKeyClass() {}
    
        public int getOrderID() {
            return orderID;
        }
        public setOrderID(int orderID) {
            this.orderID = orderID;
        }
        public int getAccountID() {
            return accountID;
        }
        public setOrderID(int accountID) {
            this.accountID = accountID;
        }
    
        public int hashCode() {
        int hash = 1;
        hash = hash * 31 + orderID.hashCode();
        hash = hash * 31 + (accountID == null ? 0 : accountID.hashCode());
        return hash;
        }
    
        public boolean equals(Object obj) {
            if (obj == this) return true;
            if (obj == null) return false;
            if (!(obj instanceof MyCompoundKeyClass)) return false;
            MyCompoundKeyClass k = (MyCompoundKeyClass) obj;
            return k.accountID == accountID && k.orderID == orderID;
        }
    }
    
  7. 入力アダプタ(channel1)からのチャネル・ダウンストリームを構成し、次の例で示される高可用性入力アダプタのtimeProperty設定に基づいて、アプリケーションのタイムスタンプを構成します。

    wlevs:expressiontimePropertyの値に設定する必要があります。

    <wlevs:adapter id="myHaInputAdapter" provider="ha-inbound" >
      <wlevs:instance-property name="eventType" value="HelloWorldEvent"/>
      <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>
    
  8. Oracle Event Processingの高可用性相関出力アダプタfailOverDelayを構成します。

    次の例は、相関出力アダプタの構成を示し、ここではfailOverDelayが2000ミリ秒になっています。

    <wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
      <wlevs:listener ref="JMSOutboundAdapter"/>
      <wlevs:instance-property name="failOverDelay" value="2000"/>
    </wlevs:adapter>
    
  9. 2番目の通常JMS入力アダプタを作成します。

    次の例は、JMSInboundAdapter2という名前のJMSアダプタを示しています。

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

    次のJMS入力アダプタは、1番目のJMS入力アダプタ(JMSInboundAdapterなど)と同一となるように構成する必要があります。次の例は、両方のJMS入力アダプタのコンポーネント構成ファイルを示します。両アダプタは、同一のプロバイダを含む完全に同一の構成になる必要があります。

        <jms-adapter>
            <name>JMSInboundAdapter</name>
            <jndi-provider-url>t3://localhost:7001</jndi-provider-url>
            <destination-jndi-name>./Topic1</destination-jndi-name>
            <user>weblogic</user>
            <password>weblogic</password>
            <work-manager>JettyWorkManager</work-manager>
            <concurrent-consumers>1</concurrent-consumers>
        </jms-adapter>
    
        <jms-adapter>
            <name>JMSInboundAdapter2</name>
            <jndi-provider-url>t3://localhost:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <user>weblogic</user>
            <password>weblogic</password>
            <work-manager>JettyWorkManager</work-manager>
            <concurrent-consumers>1</concurrent-consumers>
        </jms-adapter>
        ...
    </wlevs:config>
    
  10. 相関ソースとして機能するチャネルを作成します。

    ソースとして2番目の通常JMS入力アダプタを持つこのチャネルを構成する必要があります。

    次の例は、ソースがJMSInboundAdapter2clusterCorrelatingOutstreamという名前の相関ソースを示します。

        <wlevs:adapter id="JMSInboundAdapter2" provider="jms-inbound">
        </wlevs:adapter>
    
        <wlevs:channel id="clusterCorrelatingOutstream" event-type="StockTick" advertise="true">
            <wlevs:source ref="JMSInboundAdapter2"/>
        </wlevs:channel> 
    
  11. correlatedSourceを持つOracle Event Processingの高可用性相関出力アダプタを構成します。

    次の例は、相関出力アダプタの構成を示し、ここではcorrelatedSourceclusterCorrelatingOutstreamになっています。

    <wlevs:adapter id="myHaCorrelatingAdapter" provider="ha-correlating" >
      <wlevs:listener ref="JMSOutboundAdapter"/>
      <wlevs:instance-property name="failOverDelay" value="2000"/>
      <wlevs:instance-property name="correlatedSource"       ref="clusterCorrelatingOutstream"/>
    </wlevs:adapter>
    
  12. アプリケーションが、Oracle Event Processingの高可用性タイプ1アプリケーションで、既存のセカンダリと完全に同一の出力イベントのシーケンスを生成する必要がある場合、相関出力アダプタのwarm-up-window-lengthを構成します。
  13. コンポーネント構成ファイルを構成し、次の例で示すように、インバウンドJMSアダプタおよびアウトバウンドJMSアダプタのsession-transactedを有効にします。
        <jms-adapter>
            <name>JMSInboundAdapter</name>
            <jndi-provider-url>t3://localhost:7001</jndi-provider-url>
            <destination-jndi-name>./Topic1</destination-jndi-name>
            <user>weblogic</user>
            <password>weblogic</password>
            <work-manager>JettyWorkManager</work-manager>
            <concurrent-consumers>1</concurrent-consumers>
            <session-transacted>true</session-transacted>
        </jms-adapter>
    
        <jms-adapter>
            <name>JMSInboundAdapter2</name>
            <jndi-provider-url>t3://localhost:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <user>weblogic</user>
            <password>weblogic</password>
            <work-manager>JettyWorkManager</work-manager>
            <concurrent-consumers>1</concurrent-consumers>
            <session-transacted>true</session-transacted>
        </jms-adapter>
        ...
        <jms-adapter>
            <name>JMSOutboundAdapter</name>
            <event-type>JMSEvent</event-type>
            <jndi-provider-url>t3://localhost:7001</jndi-provider-url>
            <destination-jndi-name>./Topic2</destination-jndi-name>
            <delivery-mode>nonpersistent</delivery-mode>
            <session-transacted>true</session-transacted>
        </jms-adapter>
        ...
    </wlevs:config>
  14. オプションで、コンポーネント構成ファイルを、次に示すように、Oracle Event Processingの高可用性入力アダプタおよび相関出力アダプタを含むように構成します。
        <ha:ha-inbound-adapter>
            <name>myHaInputAdapter</name>
        </ha:ha-inbound-adapter>
        ...
        <ha:ha-correlating-adapter>
            <name>myHaBroadcastAdapter</name>
            <fail-over-delay>2000</fail-over-delay>
        </ha:ha-correlating-adapter>
  15. オプションで、ActiveActiveGroupBeanをEPNに追加し、スケーラビリティを向上します。
  16. Oracle Event Processingは、Oracle Event Processingサーバーのいずれかをプライマリとして自動的に選択します。

17.10 高可用性アダプタの構成

チャネルやプロセッサなどのEPN内の他のコンポーネントを構成する方法と同様に、EPNアセンブリ・ファイルおよびコンポーネント構成ファイルでOracle Event Processingの高可用性アダプタを構成します。

Oracle Event Processingの高可用性の構成に変更を加えた後は、Oracle Event Processingアプリケーションを再デプロイする必要があります。OSGiバンドルのデプロイを参照してください。

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

17.10.1 高可用性入力アダプタの構成

Oracle Event Processingの高可用性ブロードキャスト入力アダプタは、BroadcastInputAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Event Processingの高可用性入力アダプタを宣言するためのルート要素は、provider要素をha-inboundに設定したwlevs:adapterです。入力アダプタでOracle Event Processingの高可用性入力アダプタのwlevs:listener要素も指定します。

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

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

<wlevs:channel id="inputChannel" event-type="MyEventType ">
    <wlevs:source ref="myHaInputAdapter"/>
    <wlevs:application-timestamped>
        <wlevs:expression>arrivalTime</wlevs:expression>
    </wlevs:application-timestamped>
</wlevs:channel>

表17-3は、追加子要素を説明しています。

表17-3 高可用性入力アダプタ用wlevs:adapterの子要素

子要素 説明

wlevs:instance-property

1つ以上のinstance-property要素のnameおよびvalue属性を指定します。

表17-4に、サポートされているインスタンス・プロパティと、その名前属性および値属性を示します。

表17-4 高可用性入力アダプタのインスタンス・プロパティ

名前

timeProperty

高可用性入力アダプタが時間値を割り当てる対象のイベント・プロパティ名を指定します。

これは、高可用性入力アダプタの接続対象となる、ダウンストリームEPNコンポーネントのwlevs:application-timestamped要素で使用するプロパティと同一です。

keyProperties

Oracle Event Processingの高可用性入力アダプタがイベント・インスタンスを識別するために使用する、1つ以上のイベント・プロパティのスペースで区切られたリストを指定します。

1つ以上のプロパティを指定する場合は、keyClassを指定する必要があります。

デフォルト: すべてのイベント・プロパティ。

keyClass

複合キーとして使用される完全修飾Javaクラス名を指定します。

デフォルトでは、keyProperties設定が使用されない場合、keyClass内のすべてのJavaBeanプロパティがkeyPropertiesとなるように仮定されます。

eventType

Oracle Event Processingの高可用性入力アダプタが実際の入力アダプタから受信するイベントの種類名を指定します。これは、高可用性入力アダプタの接続対象となる、ダウンストリームEPNコンポーネントで使用するイベント型と同一です。

タプル・イベントの場合、このプロパティは必須です。すべての他のJavaクラス・ベースのイベント型の場合、このプロパティはオプションです。

構成ファイル

Oracle Event Processingの高可用性入力アダプタの構成用ルート要素は、ha-inbound-adapterです。name子要素は、次に示すアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-inbound-adapter>
    <name>myHaInputAdapter</name>
    <heartbeat units="millis">1000</heartbeat>
    <batch-size>10</batch-size>
</ha:ha-inbound-adapter>

表17-5は、追加子要素を説明しています。

表17-5 子要素

子要素 説明

heartbeat

時間を進めるためのハートビート・イベントを生成するまでに高可用性入力アダプタが待機できる時間の長さを指定します。

units属性の有効な整数値:

  • nanos: 指定されたナノ秒数を待機します。

  • millis: 指定されたミリ秒数を待機します。

  • secs: 指定された秒数を待機します。

デフォルト: ハートビートが送信されません。

batch-size

プライマリがセカンダリにブロードキャストする各タイミング・メッセージにおいてイベント数を指定します。nの値は、n{key, time}のペアが各メッセージに送信されるという意味になります。このプロパティは、パフォーマンス・チューニングに使用できます。

デフォルト: 1 (バッチを無効化)。

17.10.2 バッファリング出力アダプタの構成

Oracle Event Processingの高可用性バッファリング出力アダプタは、SlidingWindowQueueTrimmingAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Event Processingの高可用性バッファリング出力アダプタを宣言するためのルート要素は、次の例で示すように、provider要素をha-bufferingに設定したwlevs:adapterです。

<wlevs:adapter id="mySlidingWindowingAdapter" provider ="ha-buffering">
  <wlevs:listener>
     <bean class="com.bea.wlevs.example.cluster.ClusterAdapterBean"/>
  </wlevs:listener>
  <wlevs:instance-property name="windowLength" value="15000"/>
</wlevs:adapter>

表17-6は、追加子要素を説明しています。

表17-6 子要素

子要素 説明

wlevs:listener

Oracle Event Processingの高可用性バッファリング出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-7で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-7は、インスタンス・プロパティを一覧表示しています。

表17-7 インスタンス・プロパティ

名前

windowLength

スライディング・ウィンドウのサイズを整数のミリ秒で指定します。

デフォルト: 15000

構成ファイル

Oracle Event Processingの高可用性バッファリング出力アダプタの構成用ルート要素は、ha-buffering-adapterです。特定のアダプタのname子要素は、次に示すアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-buffering-adapter >
    <name>mySlidingWindowingAdapter</name>
    <window-length>15000</window-length>
    <warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-buffering-adapter >

表17-8は、Oracle Event Processingの高可用性バッファリング出力アダプタに構成できるha-buffering-adapterの追加子要素を説明します。

表17-8 子要素

子要素 説明

window-length

スライディング・ウィンドウのサイズを整数のミリ秒で指定します。

デフォルト: 15000

warm-up-window-length

時間を進めるためのハートビート・イベントを生成するまでに高可用性入力アダプタが待機できる時間の長さを指定します。

units属性の有効な整数値:

  • seconds: 指定された秒数を待機します。

  • minutes: 指定された分数を待機します。

デフォルト: unitssecondsです。

17.10.3 ブロードキャスト出力アダプタの構成

Oracle Event Processingの高可用性ブロードキャスト出力アダプタは、GroupBroadcastQueueTrimmingAdapterクラスによって実装されます。

アセンブリ・ファイル

Oracle Event Processingの高可用性ブロードキャスト出力アダプタを宣言するためのルート要素は、次に示すように、provider要素をha-broadcastに設定したwlevs:adapterです。

<wlevs:adapter id="myBroadcastAdapter" provider="ha-broadcast">
    <wlevs:listener ref="actualAdapter"/>
    <wlevs:instance-property name="keyProperties" value="time"/>
    <wlevs:instance-property name="monotonic" value="true"/>
</wlevs:adapter>

表17-9は、追加子要素を説明しています。

表17-9 子要素

子要素 説明

wlevs:listener

Oracle Event Processingの高可用性ブロードキャスト出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-10で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-10は、インスタンス・プロパティを一覧表示しています。

表17-10 インスタンス・プロパティ

名前

keyProperties

Oracle Event Processingの高可用性ブロードキャスト出力アダプタがイベント・インスタンスを識別するために使用する、1つ以上のイベント・プロパティのスペースで区切られたリストを指定します。

1つ以上のプロパティを指定する場合は、keyClassを指定する必要があります。

デフォルト: すべてのイベント・プロパティ。

keyClass

複合キーとして使用されるJavaクラスの完全修飾なクラス名を指定します。

デフォルトでは、keyProperties設定が使用されない場合、keyClass内のすべてのJavaBeanプロパティがkeyPropertiesとなるように仮定されます。

複合キーは、monotonicおよびtotalOrderになることがあります。

monotonic

キーの値が(時間値のように)常に増加するかどうかを指定します。

有効値は次のとおりです。

  • true: キーは常に増加します。

  • false: キーは常に増加しません。

デフォルト: false

totalOrder

イベント・キーが一意かどうかを指定します。インスタンス・プロパティmonotonictrueに設定されている場合のみ適用できます。

有効な値は次のとおりです。

  • true: イベント・キーは一意です。

  • false: イベント・キーは一意ではありません。

デフォルト: true

構成ファイル

Oracle Event Processingの高可用性ブロードキャスト出力アダプタの構成用ルート要素は、ha-broadcast-adapterです。特定のアダプタのname子要素は、次に示すように、このアダプタが宣言されているEPNアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-broadcast-adapter>
    <name>myBroadcastAdapter</name>
    <trimming-interval units="events">10</trimming-interval>
    <warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-broadcast-adapter>

表17-11は、追加子要素を説明しています。

表17-11 子要素

子要素 説明

trimming-interval

トリミング・メッセージがunitsの整数の数としてブロードキャストされる間隔を指定します。このプロパティをパフォーマンスの調整に使用できます(高可用性パフォーマンスのチューニングを参照)。

units属性の有効な値:

  • events: 指定されたイベント数の処理後に、トリミング・メッセージをブロードキャストします。

  • millis: 指定されたミリ秒数の後に、トリミング・メッセージをブロードキャストします。

デフォルト: unitseventsです。

warm-up-window-length

以前に失敗したセカンダリの再起動後または新しいセカンダリが追加された後、アプリケーションが状態を再構築するのにかかる時間の長さを指定します。

units属性の有効な整数値:

  • seconds: 指定された秒数を待機します。

  • minutes: 指定された分数を待機します。

デフォルト: unitssecondsです。

詳細は、「適切なwarm-up-window-length時間の選択」を参照してください。

17.10.4 相関出力アダプタの構成

Oracle Event Processingの高可用性相関出力アダプタは、CorrelatedQueueTrimmingAdapterインタフェースによって実装されます。

アセンブリ・ファイル

Oracle Event Processingの高可用性相関出力アダプタを宣言するためのルート要素は、次に示すように、provider要素をha-correlatingに設定したwlevs:adapterです。

<wlevs:adapter id="myCorrelatingAdapter" provider="ha-correlating">
    <wlevs:listener>
        <bean class="com.bea.wlevs.example.cluster.ClusterAdapterBean"/>
    </wlevs:listener>
    <wlevs:instance-property name="correlatedSource" ref="clusterCorrOutstream"/>
    <wlevs:instance-property name="failOverDelay" value="2000"/>
</wlevs:adapter>

表17-12は、追加子要素を説明しています。

表17-12 子要素

子要素 説明

wlevs:listener

Oracle Event Processingの高可用性バッファリング出力アダプタから、通常の出力アダプタのダウンストリームを指定します。

wlevs:instance-property

表17-13で説明するように、instance-property要素のnameおよびvalue属性を1つ以上指定します。

表17-13は、インスタンス・プロパティを一覧表示しています。

表17-13 インスタンス・プロパティ

名前

correlatedSource

相関対象のイベント・ソースを指定します。このソースから参照されるイベントは、トリミング・キューからパージされます。フェイルオーバー時にキュー内に留まるイベントは再生されます。

failOverDelay

フェイルオーバー後に相関関係が再起動される速さを決定するために使用される、遅延タイムアウトをミリ秒単位で指定します。

デフォルト: 0ミリ秒。

構成ファイル

Oracle Event Processingの高可用性相関出力アダプタの構成用ルート要素は、ha-correlating-adapterです。特定のアダプタのname子要素は、次に示すように、このアダプタが宣言されているEPNアセンブリ・ファイル内の対応するwlevs:adapter要素のid属性と一致している必要があります。

<ha:ha-correlating-adapter>
    <name>myCorrelatingAdapter</name>
    <window-length>15000</window-length>
    <warm-up-window-length units="minutes">6</warm-up-window-length>
</ha:ha-correlating-adapter>

表17-14は、子要素を説明しています。

表17-14 子要素

子要素 説明

fail-over-delay

フェイルオーバー後に相関関係が再起動される速さを決定するために使用される、遅延タイムアウトをミリ秒単位で指定します。

デフォルト: 0ミリ秒

warm-up-window-length

以前に失敗したセカンダリの再起動後または新しいセカンダリがunitsの整数の数として追加された後、アプリケーションが状態を再構築するのにかかる時間の長さを指定します。

units属性の有効な値:

  • seconds: 指定された秒数を待機します。

  • minutes: 指定された分数を待機します。

デフォルト: unitssecondsです。

詳細は、「適切なwarm-up-window-length時間の選択」を参照してください。

window-length

イベントの保存されたバッファの長さ(ミリ秒単位)。

trimming-interval

セカンダリ・バッファからイベントをトリミングする必要のある間隔。単位はeventsまたはmillisです。

heartbeat

このアダプタにおけるハートビート・タイムアウトの値。ハートビートは、このアダプタでイベントが生成されずにn時間単位が経過すると生成されます。デフォルトの時間単位はナノ秒です。

batch-size

イベント・タイムスタンプをセカンダリに送信するときのバッチ・サイズ(イベント数単位)。デフォルトでは、バッチ処理は無効です。