2016-05-31 15 views
1

私はRabbitMQとその.NETコネクタをしばらく再生しています。 テスト中の期間の後、RabbitMQをWebアプリケーションとAPIのネットワークでブローカーとして使用している私の新しいシステムは、プロダクションをヒットしました。 すべてのアプリが数分で止まった 私はいくつかのOS依存のしきい値を突破したり、クライアントのTCP/IP接続さえもWebサーバーにヒットしなかったブロックの後でいくつかのTCPスタックを台無しにしてしまったと思います。RabbitMQ、.NET、マルチスレッド

私は、数十のプロセスと数千のスレッドを通じて広がった激しいトラフィックに対処する方法についてはまだまだ良い資料を見つけることができませんでした。

私は毎秒10k +スレッドを生成するシステムを持っていますが、それぞれ1つの接続でメッセージをドロップしてから終了する必要があります。 私はこれらのメッセージすべてに「キャッチャー」を2つしか持っていません。

すでにいくつかの対策が行われています。 それぞれの新しいスレッドのための新しい接続を使用しない - >接続ファクトリを宣言し、静的な接続を使用(接続とチャンネルの機能は、スレッドセーフであると言われている) - >はここ

を解決します工場

public static class Factory 
    { 
     private static IConnection sharedConnection_cl; 
     public static IConnection SharedConnection_cl 
     { 
      get 
      { 
       if (sharedConnection_cl == null) 
       { 
        sharedConnection_cl = GetRabbitMqConnection(); 
       } 
       return sharedConnection_cl; 
     } 

    private static IConnection GetRabbitMqConnection() 
      { 
       ConnectionFactory connectionFactory = new    ConnectionFactory(); 
       connectionFactory.HostName = "x.y.z.w"; 
       connectionFactory.UserName = "notTheGuestUser"; 
       connectionFactory.Password = "abcdef"; 
       connectionFactory.VirtualHost = "/dedicatedHost"; 
       return connectionFactory.CreateConnection(); 
      } 

ないのコードは、すべての利用可能なアーランはを処理に使用します。 Erlangプロセスのスレッショルドは10分以内に達しました(同じ接続上のクローズドチャネルはサーバー上の対応するErlangプロセスの停止を引き起こさない) - > 任意の接続の最大チャネル数にスレッシュホールドを追加し、セマフォを使用してアクセスします。すべては、たまに接続が閉じられ、再作成(connetionが閉じているときに、対応するErlangのプロセスが終了する)を取得します - >

を解決ここで今すぐチャネルしきい値

public static class Factory 
{ 
    private static IConnection sharedConnection_cl; 
    private static int channelCount_int { get; set; } 
    static Semaphore connectionAccessSemaphore_sem = new Semaphore(1, 1); 
    public static IConnection SharedConnection_cl 
    { 
     get 
     { 
      if (sharedConnection_cl == null) 
      { 
       sharedConnection_cl = GetRabbitMqConnection(); 
       channelCount_int = 0; 
      } 
      connectionAccessSemaphore_sem.WaitOne(); 
      if (channelCount_int > 10000) 
      { 

       sharedConnection_cl.Close(); 
       sharedConnection_cl = GetRabbitMqConnection(); 
       channelCount_int = 0; 
      } 
      else 
      { 
       channelCount_int++; 
      } 
      connectionAccessSemaphore_sem.Release(); 
      return sharedConnection_cl; 
     } 
    } 

を管理するコードです。.. 。...(それはわずか数分から..時間のカップルに避けられないブロックの苦しみを長引かせるだろう)OSに

を標準のしきい値を増分を超えて接続とチャンネルを管理するために何か良い練習があり、回避するために、 OSのしきい値のヒットとサチュールの出現傾向は?

ありがとうございます。

+0

"私はこれらのメッセージすべてに「キャッチャー」を2つしか持っていません。あなたは加入者を意味しますか? –

+0

これは、https://www.rabbitmq.com/memory.html、https://www.rabbitmq.com/persistence-conf.html –

+0

を参照してください。このマイクロサービスアーキテクチャをチェックしてください。 https://msdn.microsoft。com/ja-jp/magazine/mt595752.aspx – Jaider

答えて

1

いいえ、解決策はすでにありました。セマフォを上に移動するだけで、そのトリックができました。システムの再起動時に、すべてのappPoolが終了したときに、接続インスタンスの割り当てに並行性の問題があるとは考えていませんでした。 - アプリケーションプールのロックは、サーバー上のすべてのTCP接続をロックする理由>

public static class Factory{ 
private static IConnection sharedConnection_cl; 
private static int channelCount_int { get; set; } 
static Semaphore connectionAccessSemaphore_sem = new Semaphore(1, 1); 
public static IConnection SharedConnection_cl 
{ 
    get 
    { 
     connectionAccessSemaphore_sem.WaitOne(); 

     if (sharedConnection_cl == null) 
     { 
      sharedConnection_cl = GetRabbitMqConnection(); 
      channelCount_int = 0; 
     } 

     if (channelCount_int > 10000) 
     { 

      sharedConnection_cl.Close(); 
      sharedConnection_cl = GetRabbitMqConnection(); 
      channelCount_int = 0; 
     } 
     else 
     { 
      channelCount_int++; 
     } 
     connectionAccessSemaphore_sem.Release(); 
     return sharedConnection_cl; 
    } 
} 

わからないを解決しました。

関連する問題