メッセージ キューは、ネットワーク負荷分散を介して機能できます

この記事では、Microsoft Message Queuing (MSMQ) がネットワーク負荷分散 (NLB) を介して機能する方法について説明します。

元の製品バージョン: Microsoft メッセージ キュー
元の KB 番号: 899611

概要

次の記事では、NLB を介して MSMQ を機能する方法について説明します。 この記事では、MSMQ の正しくない構成の可能性についても説明します。

重要

この資料には、レジストリの編集方法が記載されています。 レジストリを変更する前にレジストリのバックアップを必ず作成してください。 また、問題が発生した場合に備えて、レジストリの復元方法を理解しておいてください。 レジストリをバックアップ、復元、変更する方法の詳細については、「 高度なユーザー向けの Windows レジストリ情報」を参照してください。

サポートされる構成

MSMQ は、次の構成でメッセージを送受信する NLB 環境でサポートされています。

  • Direct=TCP を使用した非トランザクション メッセージング
  • 検証が無効になっている Direct=OS を使用した非トランザクション メッセージング
  • Direct=HTTP を使用した非トランザクション メッセージング
  • ストアおよび転送サーバーと 1 つのバックエンド サーバーを使用する特定の構成を使用したトランザクション メッセージング。

注:

これらの構成のいずれかでサポートされている宛先は、プライベート キューのみです。 仮想ネットワーク名には対応する Active Directory ディレクトリ サービス オブジェクトがないため、宛先キューのプロパティを照会できません。 標準パスを使用する代わりに直接形式名を使用してパブリック キューにアクセスする限り、パブリック キューにメッセージを送信できる場合があります。

Direct=TCP を使用した非トランザクション メッセージング

この構成は、特定の構成を変更せずに機能します。

Direct=OS を使用した非トランザクション メッセージング

この構成は、検証が無効になっている場合にのみ機能します。 検証を無効にするには、MSMQ 2.0 と Windows 2000 および MSMQ 3.0 の次のレジストリ キーを Windows XP または Windows Server 2003 と共に追加する必要があります。

警告

レジストリ エディタや他の方法を使用してレジストリを変更する際、適切に変更しないと重大な問題を引き起こす可能性があります。 このような問題が発生した場合は、オペレーティング システムの再インストールが必要になることがあります。 こうした問題の修復について、マイクロソフトはいかなる保証もいたしません。 レジストリの変更はユーザー自身の責任において行ってください。 次の手順に従って、レジストリ エディターを終了します。

  1. [スタート] ボタン、[ファイル名を指定して実行] の順にクリックし、「regedit」と入力して、[OK] をクリックします。
  2. レジストリで次のキーを見つけてクリックします。
    HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ\Parameters
  3. [編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。
  4. 「IgnoreOSNameValidation」と入力し、Enter キーを押します。
  5. [編集] メニューの [変更] をクリックします。
  6. 「1」と入力し、[OK] をクリックします。

既定では、MSMQ は受信したメッセージを確認して、メッセージがローカル コンピューターを対象としているかどうかを判断します。 メッセージがローカル コンピューターを対象としていない場合、メッセージは拒否されます。

ネットワーク ロード バランサーの背後にあるサーバーにメッセージが送信されると、メッセージはロード バランサーの名前を使用するか、ネットワーク ロード バランサーの仮想 IP に割り当てられたネットワーク名を使用して送信されます。 次に、ネットワーク ロード バランサーはメッセージを MSMQ レシーバーにルーティングします。 ただし、MSMQ 受信側のローカル キュー マネージャーは、メッセージ内のコンピューター名と宛先名が一致しないことを識別し、キュー マネージャーはメッセージを破棄します。 このレジストリ値を設定すると、MSMQ は対象のコンピューター名を検証しなくなり、メッセージを受け入れます。

Direct=HTTP を使用した非トランザクション メッセージング

この構成は、特定の構成を変更せずにサポートされます。

ストアおよび転送サーバーと 1 つのバックエンド サーバーを使用する特定の構成を使用したトランザクション メッセージング

この構成では、トランザクション メッセージングは、メッセージを受信するノードが受信キューを 1 つのバックエンド サーバーにマップする場合にのみ HTTP メッセージングをサポートします。 宛先キューが個々のノードにある場合、HTTP トランザクション メッセージはサポートされません。

この構成の詳細については、「 Windows Server 2003 および Windows XP Professional の Microsoft Message Queuing (MSMQ) HTTP 展開シナリオ」 ホワイト ペーパーを参照してください。

ロード バランサーの背後にある各メンバー ノードに宛先キューが存在するトランザクション メッセージングの構成では、次の理由からメッセージの送受信はサポートされていません。

  • 重複するメッセージ
  • 送信者の未確認メッセージ
  • 不完全なトランザクション

トランザクション メッセージと受信確認

トランザクション メッセージがコンピューターによって受信されると、メッセージがストレージに書き込まれ、メッセージがログに記録され、注文の受信確認が送信者に送信されます。 注文の受信確認は、direct=TCP を使用して元のメッセージが送信された IP アドレスに送信されます。 その後、メッセージは送信者によって受信され、メッセージは送信キューから削除されます。

指定した時間内に送信側サーバーが受信確認を受信しなかった場合、元のメッセージが再送信されます。 メッセージが宛先に到着すると、宛先サーバーはログを調べ、サーバーがそのメッセージを既に受信していることを検出します。 そのため、宛先サーバーはメッセージを拒否し、別の受信確認を返します。 宛先サーバーは、注文の受信確認が送信者によって受信されるまで受信確認を送信し続けます。 ログ記録では、重複するメッセージが受信されないようにし、注文の受信確認によって、メッセージが受信されたことを送信者に確認します。

ネットワーク ロード バランサーとトランザクション メッセージに関する問題

ロード バランサーを介してメッセージが送信されると、ターゲット コンピューターにはロード バランサーからのメッセージが表示されます。 次に、宛先コンピューターは、新しいセッションを通じて注文の受信確認を送信します。 そのため、ロード バランサーは、Web サーバーまたは同様のサービスの状態を維持するために同じロジックを使用できません。

このシナリオで最も一般的な問題は、複数のサーバーがロード バランサー経由でメッセージを送信するが、すべての注文確認が正しくないサーバーに送信されるということです。 この動作により、未確認のメッセージが送信コンピューターの送信キューに蓄積されます。 さらに、送信者が注文の受信確認を受信しなかった場合、送信者はメッセージを再送信します。 2 回目の試みでは、ロード バランサーを介してメッセージを送信しようとすると、別のコンピューターにメッセージが送信される可能性があります。 このコンピューターでは、このメッセージは以前に表示されず、メッセージは新しいメッセージとして処理されます。 メッセージが NLB 全体を移動できるようにするために、検証が無効になっていることを忘れないでください。

ロード バランサーを介して送信されたメッセージは、注文の受信確認を受信する前に、ロード バランサーの背後にあるすべてのサーバーによって 1 回受信および処理される場合があります。 さらに、複数のメッセージにまたがるトランザクションを常に処理したり、順番に到着したりすることはできません。 そのため、NLB を使用する場合、MSMQ ではトランザクション メッセージの送信はサポートされません。