Coherenceの優先度タスクを使用すると、レスポンス時間の要件が厳しいアプリケーションで、Coherence内のプロセス実行をより詳細に制御できます。たとえば、実行およびリクエストのタイムアウトを構成して、実行時間の長いスレッドの待機時間を制限できます。さらに、カスタム・タスクAPIを使用して、アプリケーションで問合せ処理を制御できます。これらの機能は、データ・グリッドのパフォーマンスおよびスループットに大きく影響する可能性があるため、その使用には細心の注意が必要です。
Coherenceのタスク実行タイムアウトの構成時には注意が必要です。この機能を実装する前であるため、タイムアウト例外を処理していないCoherenceアプリケーションの場合は特に当てはまります。たとえば、CacheStore
内のライトスルーがブロックされ、構成済のタイムアウト値を超えた場合、Coherenceタスク・マネージャはスレッドの実行を中断しようとし、例外がスローされます。同様に、構成したタイムアウトを問合せや集計が超えた場合も、中断されて例外がスローされます。この機能を使用するアプリケーションでは、これらの例外を正常に処理してシステムの整合性を確保する必要があります。この構成はサービスごとに実行されるため、この機能を考慮せずに設計されている既存のキャッシュやサービスでこれらの設定を変更する場合は、細心の注意を払う必要があります。
<request-timeout>
、<task-timeout>
、<task-hung-threshold>
の各要素を使用して、サービスのワーカー・スレッドの実行タイムアウトを構成します。このタイムアウト設定はキャッシュ構成ファイルで構成され、コマンドライン・パラメータを使用して設定することも可能です。サービス・スレッドのタイムアウト設定の詳細は、第46章「サービス・ガーディアンの使用方法」を参照してください。
表27-1では、実行タイムアウトの要素について説明します。
表27-1 実行タイムアウトの要素
要素名 | 説明 |
---|---|
< |
タイムアウト可能なリクエスト(たとえば、
|
< |
タイムアウト可能なタスク(たとえば、 |
< |
タスクが実行できる時間をミリ秒単位で指定します。この時間を超過すると、ハングしたと見なされます。注意: ポストされたタスクがまだ開始されていない場合は、ハングと見なされません。この属性は、スレッド・プールが使用されている( |
次の例では、分散キャッシュ・スレッド・カウントを7
、タスク・タイムアウトを5000
ミリ秒、タスク・ハングしきい値を10000
ミリ秒に設定します。
例27-1 タスク時間およびタスク・ハング構成のサンプル
<caching-schemes> <distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <thread-count>7</thread-count> <task-timeout>5000ms</task-timeout> <task-hung-threshold>10000ms</task-hung-threshold> </distributed-scheme> </caching-schemes>
クライアント・リクエスト・タイムアウトを15
ミリ秒に設定します。
例27-2 クライアント・リクエスト・タイムアウト構成のサンプル
<distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <request-timeout>15000ms</request-timeout> </distributed-scheme>
注意: request-timeout は、常にthread-hung-threshold やtask-timeout より長くする必要があります。 |
コマンドライン・オプションを使用すると、ノードのサービス・タイプのデフォルト(分散キャッシュ、起動、プロキシなど)を設定できます。表27-2では、各オプションについて説明します。
表27-2 サービス・タイプの設定用のコマンドライン・オプション
オプション | 説明 |
---|---|
|
レプリケーション・キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト |
|
オプティミスティック・キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト |
|
分散キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト |
|
分散キャッシュ・サービス用のデフォルトのサーバー実行タイムアウト |
|
分散キャッシュ・サービスでスレッドがハングと報告されるまでのデフォルト時間 |
|
起動サービス用のデフォルトのクライアント・リクエスト・タイムアウト |
|
起動サービスでスレッドがハングと報告されるまでのデフォルト時間 |
|
起動サービス用のデフォルトのサーバー実行タイムアウト |
|
プロキシ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト |
|
プロキシ・サービス用のデフォルトのサーバー実行タイムアウト |
|
プロキシ・サービスでスレッドがハングと報告されるまでのデフォルト時間 |
PriorityTask
インタフェースを使用すると、スレッド・プールを使用してタスク実行のスケジュールを指定する順序を制御したり、その実行時間を指定された限度まで保持できます。また、PriorityTask
のインスタンスは、通常、Invocable
インタフェースまたはRunnable
インタフェースも実装します。優先度タスクの実行と関連があるのは、タスクのバック・ログが存在する場合のみです。
APIでは、タスクの実行をスケジュールする次のような方法が定義されています。
SCHEDULE_STANDARD
: タスクの実行は、自然な(リクエストの受信時間に基づいた)順序でスケジュールされます。
SCHEDULE_FIRST
: タスクは、スケジュール優先度が同等以下のタスクの前にスケジュールされ、いずれかのワーカー・スレッドが使用可能になるとすぐに実行されます。
SCHEDULE_IMMEDIATE
: タスクは、アイドル状態のワーカー・スレッドによってただちに実行されます。すべてアクティブな場合は、このタスクを実行するための新しいスレッドが作成されます。
Coherenceには、優先度タスク・オブジェクトの作成に役立つ次のクラスがあります。
PriorityProcessor
は、カスタム・エントリ・プロセッサを作成する際に拡張できます。
PriorityFilter
は、カスタム優先度フィルタを作成する際に拡張できます。
PriorityAggregator
は、カスタム集計を作成する際に拡張できます。
PriorityTask
は、優先度起動クラスを作成する際に拡張できます。
これらのクラスの拡張後、開発者はいくつかのメソッドを実装する必要があります。getRequestTimeoutMillis
、getExecutionTimeoutMillis
およびgetSchedulingPriority
の戻り値は、クラスごとにアプリケーションの構成パラメータに保存する必要があります。これらのメソッドについて、表27-3に説明します。
表27-3 タスク・タイムアウトをサポートするメソッド
メソッド | 説明 |
---|---|
|
コール元スレッドがリクエスト実行の結果を待機する最大時間を取得します。リクエスト時間は、リクエストが実行のために対応するサーバー・ノードに送信された時点からの経過時間として、クライアント側で測定します。これには、リクエストを実行ノードに配信するまでの時間、タスクを受信しサービス・キューに配置してから実行が開始されるまでの間隔、タスク実行時間、結果をクライアントに戻すための時間が含まれます。 |
|
対応するサービスによって停止されるまでの、このタスクの実行が許可されている最大時間を取得します。 |
|
このタスクのスケジュールの優先度を取得します。有効な値は、 |
|
このメソッドがコールされるのは、このタスクを中断しようとする処理がすべて失敗した場合、または実行の機会がまったくないまま実行がキャンセルされた場合です。このメソッドは通常、サービス・スレッドでコールされ、実装によって遅延が発生すると対応するサービスも遅延するため、細心の注意を払って実装する必要があります。 |
タスク・タイムアウトが発生すると、ノードでRequestTimeoutException
が発生します。例27-3は、スローされる可能性のある例外を示しています。
例27-3 タスク・タイムアウトによってスローされる例外
com.tangosol.net.RequestTimeoutException: Request timed out after 4015 millis at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.checkRequestTimeout(Service.CDB:8) at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.poll(Service.CDB:52) at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.poll(Service.CDB:18) at com.tangosol.coherence.component.util.daemon.queueProcessor.service.InvocationService.query(InvocationService.CDB:17) at com.tangosol.coherence.component.util.safeService.SafeInvocationService.query(SafeInvocationService.CDB:1)