同じキューに複数のインスタンスがある場合のクラスターの例

この例では、1 つのキューに複数のインスタンスがあるクラスターにおいて、各メッセージがキューの複数のインスタンスにルーティングされます。 1 つのメッセージをキューの特定のインスタンスに強制的に送信したり、一連のメッセージをいずれか 1 つのキュー・マネージャーに送信することを選択したりできます。

図 1 は、キュー Q3の定義が複数あるクラスターを示しています。 QM1 のアプリケーションが Q3 へメッセージを書き込む場合、Q3 のどのインスタンスがメッセージを処理するかは必ずしも分かりません。 Q3のローカル・インスタンスが存在する QM2 または QM4, 上でアプリケーションが実行されている場合、デフォルトで Q3 のローカル・インスタンスが開きます。 CLWLUSEQ キュー属性を設定すると、キューのローカル・インスタンスをキューのリモート・インスタンスと同様に処理できます。

MQOPEN のオプション DefBind は、ターゲットのキュー・マネージャーが選択されるのが、MQOPEN 呼び出しを発行する際か、それとも伝送キューからメッセージを転送する際かを制御します。

DefBindMQBND_BIND_NOT_FIXED に設定すると、メッセージの伝送時に使用可能になるキューのインスタンスにメッセージを送信できます。 これにより、次のような問題が避けられます。
  • メッセージがターゲット・キュー・マネージャーに着信したときに、ターゲット・キューが使用不可になっている。
  • キューの状態が変更されている。
  • クラスター・キュー別名を使用してメッセージが書き込まれているのに、クラスター・キュー別名のインスタンスが定義されているキュー・マネージャーにターゲット・キューのインスタンスが存在しない。
伝送時にこれらの問題のいずれかが見つかった場合、ターゲット・キューの別の使用可能なインスタンスが検索され、メッセージが転送されます。 使用可能なキューのインスタンスがない場合は、送達不能キューにメッセージが入れられます。
図1: 同じキューの複数のインスタンスがあるクラスター
この図は、4 つのキュー・マネージャーが接続されたクラスターを示しています。 QM1 には、Q1 および Q5 という 2 つのキューがあります。 QM2 には、Q1 および Q3 という 2 つのキューがあります。 QM3 には、Q2 という 1 つのキューがあります。 QM4 には、 Q3 と Q4の 2 つのキューがあります。

メッセージを転送できなくなる可能性がある 1 つの要因として、MQBND_BIND_ON_OPEN を使用してメッセージが固定のキュー・マネージャーまたはチャネルに割り当てられている場合があります。 MQOPEN 時にバインドされるメッセージは、別のチャネルに再割り振りされることはありません。 メッセージの再割り振りは、クラスター・チャネルの障害処理が実際に行われているときにのみ行われることに注意してください。 チャネルが既に失敗している場合は、再割り振りは行われません。

宛先キュー・マネージャーがサービス休止になると、システムはメッセージを転送しようとします。 この場合、メッセージが失われたり重複メッセージが作られたりしてメッセージの完全性が損なわれることはありません。 キュー・マネージャーの故障によりメッセージの完全性に疑問がある場合、そのメッセージの転送は行われません。

[z/OS] IBM® MQ for z/OS® では、メッセージの再配分処理が完了するまで、チャンネルは完全には停止しない。 モードを FORCE または TERMINATE に設定した状態でチャネルを停止すると、このプロセスが中断するため、その場合は一部の BIND_NOT_FIXED メッセージがすでに別のチャネルに再割り振りされているか、メッセージの順番が狂っている可能性があります。

[z/OS]注:
  1. 同じキューに複数のインスタンスがあるクラスターを設定する前に、メッセージ相互に依存関係がないことを確認してください。 例えば、特定の順序で処理する必要や同じキュー・マネージャーで処理する必要がないようにします。
  2. 同じキューの複数のインスタンスの定義は同じにしてください。 同じにしない場合、MQINQ 呼び出しが違うと、得られる結果にも違いが生じます。