2017-04-13 10 views
5

私は、サービスバストピックによってトリガーされる消費計画で実行されているazure関数を持っています。次にキューに別のメッセージを追加するだけです(基本的にはIOは処理されません)。トリガートピックは〜1000 /秒の割合で満たされています。私は単純に機能が容易にペースを維持できると考えていましたが、実際には絶望的に圧倒されており、トピックの購読は非常に迅速に完了しています。私はそれが完全にスケールアウトされていると思われるので、何時間も実行している。ぼんやりした関数からスケーラビリティがあまりにも大きいと思いますか?

機能からどれくらいのパフォーマンスを期待できますか?スループットは1秒あたり何千というオーダーであるのでしょうか?

編集:私は定期的にログにこのエラーを見ています:

接続試行は00:00:00の時間スパン続きました。 TCPエラー コード10013:アクセス許可によって禁止された方法でソケットにアクセスしようとしました。

サービスバスのように機能していないようですか?これで

public static async Task Run(BrokeredMessage msgin, Binder binder, TraceWriter log) 
{ 
var collector = await binder.BindAsync<IAsyncCollector<BrokeredMessage>>(
       new ServiceBusAttribute("my-queue")); 

... 
} 

を::このバインディングの交換ソリューション ため

編集2

public static IAsyncCollector<BrokeredMessage> collector; 
public static async Task Run(BrokeredMessage msgin, Binder binder, TraceWriter log) 
{ 
    collector = collector ?? await binder.BindAsync<IAsyncCollector<BrokeredMessage>>(
       new ServiceBusAttribute("my-queue")); 


    ... 
} 

は、ソケットの枯渇を防止し、機能がプロデューサー問題なくペースを維持することができました。

答えて

3

私はAzureの機能で同じ問題を持っていたし。根本的な原因は、私がRunメソッド内にTCP接続を作成していたので、すべてのポートを使い果たしていたことでした。

同じマシンに多数の並列実行があった場合、それらはすべて接続を作成し、最終的にすべてのポートを使い果たしました。

そのような状況では、ServiceBusクライアントの作成の一環として接続が作成され、それを静的変数に移動することで問題が解決されました。

+0

このソリューションは私のために働いた、私は上記の詳細を追加しました。 –

3

いくつかの質問:

  • は、サービス・バスの接続文字列は、権利を管理していますか?現時点で有効なスケーリングのためには、管理権が必要です。
  • 入出力バインディングを使用しているのですか、サービスバスクライアントを自分で管理していますか?
  • host.jsonのサービスバス同時実行の設定を変更しましたか?

表示されているエラーは接続の消耗に関連しているため、関数インスタンスの使用可能な接続が不足しています。

あなたはこのショット与えることができます&スループットをスケーリング機能についてテレメトリを取得したい場合:https://github.com/Azure/Azure-Functions/wiki/App-Insights-Early-Preview

+0

はい接続文字列には完全な管理権限があります。私はbinder.BindAsyncを使用してコード内の出力をバインドしています。私はホストに触れていない。json –

関連する問題