ローカルトランザクションのトランザクションタイムアウトの監視時間は、不要となったトランザクションを回収することでシステム資源を回収する機能です。
ローカルトランザクションのタイムアウト時間は、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 |