3

ジョブサーバー: Windows Server 2008 R2 .NET バージョン: 4.5

appqueueの 2 つのサーバーを接続するために WCF を使用しています。アプリがqueueからメッセージを送受信できるようにしたい。何らかの理由で、アプリはメッセージを送信できますが、受信できません。

netMsmq バインディングは次のようになります。

<binding name="JobExecutionerBinding" receiveErrorHandling="Move">
  <security>
    <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
  </security>
</binding>

サービス バインディングは次のようになります。

これで、クライアント バインディングは次のようになります。

<endpoint   address="net.msmq://queue/private/jobs" 
            binding="netMsmqBinding" 
            bindingConfiguration="JobExecutionerBinding" 
            contract="JobExecution.Common.IJobExecutionService" 
            name="SimpleEmailService" 
            kind="" 
            endpointConfiguration=""/>

セキュリティのためにいくつかの名前を変更しました。

したがって、WC クライアントは問題なくリモート キューに送信できます。送信メッセージを適切にキューに入れ、後でリモート キュー サーバーがダウンした場合に転送します。しかし、WCF サービスを起動するたびに、次のようになります。

キューを開くときにエラーが発生しました。MSMQ がインストールされて実行されていること、キューが存在すること、読み取り元として適切な権限があることを確認してください。内部例外には追加情報が含まれる場合があります。---> System.ServiceModel.MsmqException: キューを開いているときにエラーが発生しました: キューが存在しないか、操作を実行するための十分な権限がありません。(-1072824317、0xc00e0003)。メッセージをキューから送受信できません。MSMQ がインストールされ、実行されていることを確認します。また、必要なアクセス・モードと許可でキューを開くことができることも確認してください。System.ServiceModel.Channels.MsmqQueue.OpenQueue() で System.ServiceModel.Channels.MsmqQueue.GetHandle() で System.ServiceModel.Channels.MsmqQueue.SupportsAccessMode (文字列 formatName、Int32 accessType、MsmqException&

私は 8 時間、StackOverflow とインターネットのいたるところにいました。これが私がやったことです:

  • ANONYMOUS LOGIN、Everyone、Network、Network Service、および Local Service が完全に制御できることを確認
  • リモート MSMQ サーバーを停止し、WCF サービスの動作を観察したところ、別のエラーが表示されたので、起動時に WCF サービスが MSMQ サーバーと通信していることは確かです
  • 両方のボックスで Windows ファイアウォールを無効にし、EC2 セキュリティ グループを介してすべてのポートを開きました
  • レジストリで AllowNoauthenticatedRpc と NewRemoteReadServerAllowNoneSecurityClient を 1 に設定します。
  • 両方のサーバーで MS DTC を構成しました (キューはトランザクション対応ですが、キューがトランザクション対応かどうかに関係なく同じエラーが発生します)
  • ローカルキューを使用するとWCFサーバーが正常に起動し、問題なく受信できることを確認

ヘルプ!!!リモート キューイング ソリューションなしではアプリをスケーリングできません。

4

2 に答える 2

1

あなたの投稿からは、どの層が読み取れないか、さらに重要なことにどのキューが明確ではありません。

ただし、トランザクションによるリモート キューの読み取りはサポートされていません。

メッセージ キューは、リモート キューへのトランザクション メッセージの送信をサポートしていますが、トランザクション内のリモート キューからのメッセージの読み取りはサポートしていません。これは、信頼できる正確に 1 回の受信がリモート キューから利用できないことを意味します。リモート キューからのメッセージの読み取りを参照してください 。

無効にしたとおっしゃいましたが、システムのどこかでまだトランザクションのリモート読み取りを実行していると思われます。

ベスト プラクティスの観点からは、たとえ機能するようになったとしても、あなたが望んでいたものであるため、デザインがスケーリングされないのは残念です。

リモート読み取りはオーバーヘッドが大きいため、非効率的なプロセスです。アプリケーションにリモート読み取り操作を含めると、スケーリングが制限されます。 1

リモート読み取りではなく、常にリモート書き込みを行う必要があります。

より良い方法は、メッセージングの中心点として機能するメッセージ ブローカーまたはルーター サービスを挿入することです。アプリサービスとキューサービス (紛らわしい名前) は、単にローカル キューからトランザクションとして読み取る必要あります。

すなわち

  • アプリはローカル キューをトランザクションで読み取る必要があります
  • アプリはトランザクションでリモートブローカーに送信する必要があります
  • ブローカはローカル キューをトランザクションで読み取ります
  • ブローカはリモートキューにトランザクション的に送信します

同様に、キュー層が返信したい場合は、上記の逆のプロセスが発生します。

後でパフォーマンスを向上させたい場合は、動的ルールセットまたはストレス レベルなどの環境条件に基づいて、別のマシンの別のリモート キューにメッセージをリダイレクトする動的ルーターを導入できます。

于 2014-04-29T04:40:05.463 に答える