2.2.8 障害処理
(1) 障害発生時の処理の流れ
高速メッセージ送信制御では,主に次のような障害の発生が考えられます。
- メッセージ送信処理の障害
- メッセージ送信先サーバのリソース不足による障害
- メッセージ送信先のサービス閉塞による障害
- メッセージ送信先のサービスグループ名またはサービス名の不正による障害
(a) メッセージ送信処理の障害
メッセージ送信処理での障害時の流れを次の図に示します。
図2-12 メッセージ送信処理での障害時の流れ
![[図データ]](figure/zu020290.gif)
- 説明
- メッセージ送信時の障害を検知すると,高速メッセージ送信関連定義に従ってメッセージを再送します。
- リトライ回数が定義値を超えた場合は,エラーメッセージを出力し,エラートランザクションを起動します。
(b) メッセージ送信先サーバのリソース不足による障害
メッセージ送信先サーバのリソース不足による障害時の流れを次に示します。
- サーバ側で,メッセージ受信時に処理キュー制御用バッファ(PCE)が不足している場合,送達確認エラーメッセージ(リソース不足)を応答し,受信メッセージを破棄します。
- クライアント側で送達確認エラーメッセージ(リソース不足)を受信すると,高速メッセージ送信関連定義に従ってメッセージを再送します。
- リトライ回数が定義値を超えた場合は,エラーメッセージを出力し,エラートランザクションを起動します。
(c) メッセージ送信先のサービス閉塞による障害
メッセージ送信先のサービス閉塞による障害時の流れを次に示します。
- サーバ側で,メッセージ受信時に該当するサービスが閉塞中の場合,送達確認エラーメッセージ(サービス閉塞中)を応答し,受信メッセージを破棄します。
- クライアント側で送達確認エラーメッセージ(サービス閉塞中)を受信すると,エラーメッセージを出力し,エラートランザクションを起動します(再送はしません)。
(d) メッセージ送信先のサービスグループ名またはサービス名の不正による障害
メッセージ送信先のサービスグループ名またはサービス名の不正による障害時の流れを次に示します。
- サーバ側で,メッセージ受信時に受信メッセージ中のサービスグループ名またはサービス名が不正だった場合,送達確認エラーメッセージ(サービスグループ名不正またはサービス名不正)を応答し,受信メッセージを破棄します。
- クライアント側で,送達確認エラーメッセージ(サービスグループ名不正またはサービス名不正)を受信すると,エラーメッセージを出力し,エラートランザクションを起動します(再送はしません)。
(2) 一方送信メッセージでの障害要因とシステムの処理
一方送信メッセージの送信で発生する障害の要因と,システムの処理を次の表に示します。
表2-3 一方送信メッセージでの障害要因とシステムの処理
項番 | 障害要因 | システムの処理 |
---|
1 | 送信前に起きた,XDBの障害などによるロールバック決着 | ロールバック決着でERRTRNRを起動 |
2 | 送信障害(パケットサイズの不正などの,RPC関連定義の不正) | - ERRTRNSを起動
- サービスグループレベルの出力キューの自動閉塞
- ほかの未送信メッセージの送信処理を継続※1
|
3 | 送信障害※2 | - 送信エラーとなったメッセージの送信リトライ実施※3
- 送信リトライ失敗時,ERRTRNSを起動
- サービスグループレベルの出力キューの自動閉塞※4
- ほかの未送信メッセージの送信処理を継続※1
|
4 | 送達確認待ちタイムアウト※2 |
5 | 送達確認エラーメッセージ受信(CL同期エラー) |
6 | 送達確認エラーメッセージ受信(リソース不足(PCE,IBF)) | - 送信エラーとなったメッセージの送信リトライ実施※3
- 送信リトライ失敗時,ERRTRNSを起動
- ほかの未送信メッセージの送信処理を継続※1
|
7 | - 送達確認エラーメッセージ受信(送信先サービスの閉塞)
- 自プロセスあてのサービス閉塞
| - ERRTRNSを起動
- サービスレベルの出力キューの自動閉塞※4
- ほかの未送信メッセージの送信処理を継続※1
|
8 | 送達確認エラーメッセージ受信(送信先サービスグループ名の不正) | - ERRTRNSを起動
- サービスグループレベルの出力キューの自動閉塞
- ほかの未送信メッセージの送信処理を継続※1
|
9 | 送達確認エラーメッセージ受信(送信先サービス名の不正) | - ERRTRNSを起動
- サービスレベルの出力キューの自動閉塞
- ほかの未送信メッセージの送信処理を継続※1
|
10 | 送達確認エラーメッセージ受信(メッセージ送信形態,オプションの不正) |
- (凡例)
- PCE:処理キュー制御用バッファ
- IBF:受信バッファ
- 注※1
- トランザクション同期の一方送信メッセージの場合の動作です。トランザクション非同期の場合は該当しません。
- 注※2
- メッセージが送信先に届いている場合があるため,UAPで送達確認を行う必要があります。
- 注※3
- 高速メッセージ送信関連定義で,送信リトライ回数および送信リトライ間隔を指定している場合にだけ実施します。
- 注※4
- 送信先サービス関連定義のeemchsrvdef定義コマンドで,出力キューの自動閉塞を指定している場合にだけ実施します。
(3) 一方送信メッセージの送信に失敗したとき,または送信前にロールバック決着となったときに参照できる情報
一方送信メッセージの送信に失敗したとき,または送信前にロールバック決着となったときに参照できる情報を次の表に示します。
表2-4 一方送信メッセージの送信に失敗したとき,または送信前にロールバック決着となったときに参照できる情報
項番 | 発生した障害 | 参照するエラートランザクション | 参照できる情報 |
---|
1 | トランザクション同期の一方送信メッセージの送信失敗 | ERRTRNS | - 送信先サービスグループ名
- 送信先サービス名
- 送信エラー要因(障害要因)
- 出力キューの自動閉塞の有無
- 送信メッセージ
|
2 | ERRTRNR | - 入力メッセージ
- 送信先サービスグループ名※1
- 送信先サービス名※1
- 送信エラー要因(障害要因)※1
- 出力キューの自動閉塞の有無※1
- 送信メッセージ※1
|
3 | トランザクション非同期の一方送信メッセージの送信失敗 | ERRTRNS | - 送信先サービスグループ名
- 送信先サービス名
- 送信エラー要因(障害要因)
- 出力キューの自動閉塞の有無
- 出力キュー通番
- 送信メッセージ※2
|
4 | メッセージ送信前のXDB障害などによるロールバック決着 | 項番2と同様です。 |
- 注※1
- ee_mch_cmtsend_get関数によって一方送信メッセージ情報を取得することで,同一トランザクション内で一方送信メッセージ送信要求を行ったメッセージ情報を参照できます。
- 注※2
- 一括送信したメッセージの場合,参照できるのは送信に失敗した先頭メッセージだけです。
(4) トランザクション非同期の一方送信メッセージ送信障害後の再送
トランザクション非同期の一方送信メッセージの送信で障害が発生すると,メッセージの送信を中断して,出力キューで未送信メッセージとして管理します。
未送信メッセージを再送するタイミングは,次のとおりです。
- ■出力キューが閉塞した場合
- 出力キューの閉塞解除後に再送します。
- ■出力キューが閉塞していない場合
- 高速メッセージ送信関連定義のmch_send_otqschedule_intervalオペランドで指定した間隔で送信を待ち合わせ,その後,再送します。障害要因が送信先サービス閉塞のときはサービス単位で,その他の障害要因のときはサービスグループ単位での待ち合わせとなります。待ち合わせ中に新たな送信要求があっても送信しません。
- また,出力キュー閉塞解除要求を行った場合にも再送します。
なお,一括送信したメッセージが未送信メッセージとして管理された場合は,1メッセージずつ再送します。
(5) 注意事項
サーバ側では,一方送信メッセージの受信時に同一メッセージを受信しても同一トランザクションを起動しないように,メッセージをチェックします。ただし,次の場合についてはチェックの対象外となります。
- HAサーバがダウンして再起動した場合
- クライアントが永続指定でない一方送信メッセージを送信している間に,CLサーバ(実行系)がダウンして系切り替えが発生した場合