ローカルトランザクションのトランザクションタイムアウトの監視時間は、不要となったトランザクションを回収することによりシステム資源を回収する機能です。
ローカルトランザクションのタイムアウト時間は、essetcnfコマンド/essetcnfchnlコマンドを使用して設定します。essetcnfコマンドでの設定については、「2.3 構成情報の設定」を、essetcnfchnlコマンドでの設定については、「2.4.3 イベントチャネルの環境設定」を参照してください。
イベントデータの受信処理もローカルトランザクションのトランザクションタイムアウトの監視対象となります。イベントデータが存在しない場合、イベントデータの受信処理は待ち状態になりますが、その時間もトランザクションタイムアウトの監視時間に含まれます。したがって、トランザクションタイムアウトの監視時間を短い時間にチューニングした場合は、以下のような問題が発生する可能性があります。
コンシューマがチャネルに対してlocal_beginを発行します。
コンシューマがチャネルに対してpullを発行すると、チャネルはイベントデータを蓄積していないため、pullは待ち状態となります。
サプライヤがチャネルに対してlocal_beginを発行します。
サプライヤがチャネルに対してpushを発行します。チャネルはイベントデータを保持します。この時点では、蓄積処理は行われません。
サプライヤがチャネルに対してlocal_commitを発行します。チャネルは保持していたイベントデータの蓄積処理を完了します。
コンシューマの発行したpullが復帰します。その後、コンシューマは受信したイベントデータの処理を行います。ここでトランザクションタイムアウトが発生します。
コンシューマがチャネルに対してlocal_commitを発行します。チャネルはトランザクションタイムアウトが発生したため、エラーを通知します。イベントデータが蓄積されたままの状態となります。
上記のように、pullでのデータ取得後にトランザクションタイムアウトが発生すると、コンシューマがタイムアウトを検出できるのは、local_commitとなります。その際、6.で他の資源に対するトランザクションが完了していた場合は、チャネルと他の資源の一貫性に矛盾が発生する可能性があります。
この問題を回避するためには、以下の方法があります。
ローカルトランザクションタイムアウト時間に、十分大きい値を設定します。
ES_ChannelUtil_pull_waitメソッドでデータ受信を検出後、トランザクションを開始します。
ES_ChannelUtil_pull_waitメソッド使用時の動作を以下に示します。
コンシューマがチャネルに対してpull_waitを発行すると、チャネルはイベントデータを蓄積していないため、pull_waitは待ち状態となります。
サプライヤがチャネルに対してlocal_beginを発行します。
サプライヤがチャネルに対してpushを発行します。チャネルはイベントデータを保持します。この時点では、蓄積処理は行われません。
サプライヤがチャネルに対してlocal_commitを発行します。チャネルでは、保持していたイベントデータの蓄積処理を完了します。
コンシューマがチャネルに対してlocal_beginを発行します。
コンシューマがチャネルに対してpullを発行すると、チャネルはコンシューマにpullの復帰値としてイベントデータを通知します。この時点では、チャネルにイベントデータが蓄積されたままの状態です。
コンシューマは、受信したイベントデータの処理を行います。
コンシューマがチャネルに対してlocal_commitを発行します。チャネルでは、メッセージの受信が完了したことを確認して、イベントデータを削除します。
上記のように、pull_waitを使用することによりpullは待ち状態とならず、即時復帰します。したがって、ユーザは適切なトランザクションタイムアウト時間を設定できます。
なお、pull_waitメソッドを発行した場合でも、pull_waitメソッド自身において以下のタイムアウトが発生する可能性があります。本現象が発生した場合は、pull_waitメソッドをリトライするようにしてください。
タイムアウトの種類 | 例外 | マイナーコード |
---|---|---|
pullのイベントデータ待ちタイムアウト | COMM_FAILURE | 0x464a01c1 |
ローカルトランザクションタイムアウト | COMM_FAILURE | 0x464a01c5 |
CORBAサービスのタイムアウト | COMM_FAILURE | 0x464a0101 |