Azureには、アイテムがキューに置かれたときに起動される関数アプリケーションがあります。これは次のようになります(大幅に簡略化):Azure関数の同時実行ジョブ数の制限queue
public static async Task Run(string myQueueItem, TraceWriter log)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Config.APIUri);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
StringContent httpContent = new StringContent(myQueueItem, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("/api/devices/data", httpContent);
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
ApiResponse apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json);
log.Info($"Activity data successfully sent to platform in {apiResponse.elapsed}ms. Tracking number: {apiResponse.tracking}");
}
}
これはすべてうまく動作し、かなりうまく動作します。アイテムがキューに置かれるたびに、私たちは私たちの側のあるAPIにデータを送り、応答を記録します。クール。
「キューメッセージを生成するもの」に大きなスパイクがあり、多くのアイテムが一度にキューに置かれると問題が発生します。これは、1分に1,000〜1,500件前後で発生する傾向があります。 Functions.SendToLimeade:関数の実行中に例外:
2017-02-14T01:45:31.692 mscorlibエラー・ログには、このようなものを持っています。 f-SendToLimeade __- 1078179529:リクエストの送信中にエラー が発生しました。システム: リモートサーバーに接続できません。システム:各ソケットアドレス (プロトコル/ネットワークアドレス/ポート)の1つの使用が通常許可されます 123.123.123.123:443。
最初は、これは、Azure関数のアプリケーションでローカルソケットが不足していると考えました(illustrated here)。しかし、私はIPアドレスに気づいた。 IPアドレス123.123.123.123(この例ではもちろん変更)は、HttpClientが送信しているIPアドレスです。だから今私はそれが私たちのサーバがこれらの要求を処理するために使い果たされているのだろうかと思います。
いずれにしても、ここではスケーリングの問題が発生しています。私はそれを解決する最善の方法を見つけようとしています。
いくつかのアイデア:
- それがローカルソケットの制限だ場合、article aboveは
Req.ServicePoint.BindIPEndPointDelegate
を使用してローカルポートの範囲を増加する例があります。これは有望ですが、本当にをスケールする必要があるときはどうしますか?私はこの問題が2年後に戻ってくることを望んでいません。 - リモートリミテッドの場合、Functionランタイムが一度に処理するメッセージの数を制御できるようです。ここでは、
serviceBus.maxConcurrentCalls
を1に設定でき、1つのメッセージだけを一度に処理できるという興味深い記事があります。たぶん私はこれを比較的低い数値に設定することができました。さて、ある時点で私たちのキューは処理できるよりも速くいっぱいになりますが、その時点での答えは私たちの最後にサーバーを追加することです。 - 複数のAzure関数apps?複数のAzure関数アプリケーションがあり、それらがすべて同じキューでトリガーされるとどうなりますか? Azureは機能アプリ間で作業を分割するのに十分なほどスマートなのですか?私はキューを処理している軍隊を持つことができますが、必要に応じて拡大縮小できますか?
- 私はまたキープアライブを見つけました。待ち行列のメッセージが氾濫しているので、私のソケットを何とか開いたままにしておくことができれば、おそらく大きな助けになるかもしれません。これは可能なのでしょうか、これをどうやってやるのかについてのヒントはありますか?
このようなシステムに推奨される(スケーラブルな)デザインについての洞察は非常に高く評価されます。
は今のところ、それが見えます。だから、私は新しい機能のアプリケーションを追加することについての部分は必要ではないと思います。それはすでにこれを行います。ソケットエラーメッセージがAzureのローカルインスタンスがソケットから外れているか、ここのサーバーがソケットから外れているかどうかはまだ分かりません。 –
私自身の答えも以下に加えました。これは今まで私たちのために働いているようです! –
この類似の質問/回答はまた興味があるかもしれません:https://stackoverflow.com/questions/40094041/throttling-azure-storage-queue-processing-in-azure-function-app – Alex