2017-02-27 5 views
0

Google PubSubからメッセージを引き続き取得しています。メッセージを取得するのにかかる時間が約12〜15秒で、私たちの場合には受け入れられないことを除いて、すべてうまくいっています。以下の私のCallTimingの設定です:Google Pub Sub Message .Netクライアントで問題が発生する。

public CallSettings GetPullSetting() 
    { 
     CallTiming timing = CallTiming.FromRetry(new RetrySettings(
       retryBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 0, 50), new TimeSpan(0, 0, 5), 1), 
       timeoutBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 18, 0), new TimeSpan(0, 0, 20), 1), 
       totalExpiration: Google.Api.Gax.Expiration.FromTimeout(TimeSpan.FromMilliseconds(600000)))); 

     return CallSettings.FromCallTiming(timing); 
    } 

私は最大3秒に、この待ち時間を短縮するために、組み合わせのすべての種類をしようとしています。

メッセージが正常に取得されるたびに、そしてメッセージがある場合はすぐにpullの次の反復で、そのメッセージがすぐにフェッチされます。つまり、メッセージが連続して見つかった場合は、遅延が非常に小さいpullです。

しかし問題は、pubsubにメッセージがないので、Deadline exceeded例外が発生するということです。次に、次の反復のためにpubsubでメッセージをプッシュします。この時点では、多くの時間がかかります(13〜16秒)。だから、この問題を再現するための条件は、私がメッセージをプルしようとして失敗したということです。ここに貼り付け

コード:

public void PullTest() 
     { 
      var cont = true; 
      SubscriberSettings settings = new SubscriberSettings() 
      { 
       PullSettings = GetPullSetting() 
      }; 
      SubscriberClient subscriberClient = SubscriberClient.Create(settings: settings); 
      var subscriberName = new SubscriptionName("project-name", "subscription-name"); 
      while (cont) 
      { 
       try 
       { 
        PullResponse response = subscriberClient.Pull(subscriberName, returnImmediately: false, maxMessages: 1); 
        System.Diagnostics.Trace.WriteLine(">>>>>> " + DateTime.Now.ToString()); 
        System.Diagnostics.Trace.WriteLine(">>>>>> " + "Job Recieved" + response.ReceivedMessages.ToList().FirstOrDefault()); 
        subscriberClient.Acknowledge(subscriberName, new List<string>() { response.ReceivedMessages.ToList().FirstOrDefault().AckId }); 
       } 
       catch (Exception ex) 
       { 
        System.Diagnostics.Trace.WriteLine(">>>>>> " + DateTime.Now.ToString()); 
        System.Diagnostics.Trace.WriteLine(">>>>>> " + ex.Message); 
       } 
      } 
     } 

public CallSettings GetPullSetting() 
     { 
      CallTiming timing = CallTiming.FromRetry(new RetrySettings(
        retryBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 0, 50), new TimeSpan(0, 0, 5), 1), 
        timeoutBackoff: new BackoffSettings(new TimeSpan(0, 0, 0, 18, 0), new TimeSpan(0, 0, 20), 1), 
        totalExpiration: Google.Api.Gax.Expiration.FromTimeout(TimeSpan.FromMilliseconds(600000)))); 

      return CallSettings.FromCallTiming(timing); 
     } 

答えて

1

タイムアウトの期限を超えた場合、連続したプルの間でバックオフに問題があります。基本的に、バックオフタイミングを0に近づける必要があるか、カスタム接続/クライアントを使用して遅延なく再試行する必要がある、長いポーリングソリューションを探しています。

0

遅延を最小限に抑えるには、同時に優れた複数のプル要求を持つようにしたいとしています。お客様のスループット要件に応じて、未処理のリクエストが数十件必要になることがあります。スループットが低い場合は、一度に複数のプルリクエスト(少なくとも2つまたは3つ)を使用する必要があります。締切りを過ぎているかどうかにかかわらず、いずれかの人が返却するとすぐに、別のプルリクエストを開始してください。目標は、公開されたメッセージを受信するのを待っているプルを常に要求することです。

+0

この問題は.netクライアントでのみ発生しますか?私たちはJAVAで作られた同様のコンポーネントを持っており、うまく動作します。 – Savaratkar

関連する問題