2016-10-19 2 views
0

以前は、ステートレスサービスインフラストラクチャを使用してシステムを構築しましたが、アイテムをAzureキューに置くフロントエンドAPIこれらのキューを処理する役割紙の上では、これは素晴らしく、クラウドはどのように動作するのでしょうか。私たちのキューが成長するにつれて、それはシングルスレッドで30個のバッチを処理する、私たちのアプリのより多くのインスタンスをスピンアップさせます。待ち行列が縮小するにつれて、キューが縮小されます。Azure - 保留中のアイテムに基づいて単一のスレッドアプリケーションをスケーリングするベストプラクティス

しかし、これは期待どおりに機能しなくなりました。 Azureは待ち行列内のアイテムに基づいて自動的にスケーリングされたワーカーのみであり、保留中のアイテムではありません。アイテムは5日前までにキューに入れられていたので、必要のないスケーリングされたインスタンスがたくさん残っていました。解決策として、私たちは、私たちのインスタンスを最大限必要なものにスケーリングするだけで済みました。これはクラウド全体の経験から取り除かれました。また、データの急増に伴い、バックアップが取られることもありました。理想的には、データを数秒で処理したいと思っていますが、この方法論では一度に多くのデータを扱うことができたので、数分かかっていました。

クラウドサービスのスピンアップとダウンの性質上、これはコストがかかるだけでなく、実際にリソースを追加する必要があるとき、インスタンスがスピンアップするまで10分以上待たなければなりませんでした。それは私たちが手動で待ち行列を見て、紺碧のインスタンスを調整することです。私たちは、自動でスピンアップするサードパーティのアプリケーションを開発することができますが、実際の問題は、単にインスタンスを追加または削除するのにどれくらいの時間がかかるかということです。

私たちがクラウドサービスで実行していたすべての制限のため、個々のスレッドを150個以上追加することができる1つのアプリケーションに戻ってしまい、それぞれがメインUIに戻ります。私たちは、コストのほんのわずかでシステムパワーはほとんどないため、常にクラウドサービスで実行されている40のインスタンスから、いつでも最大150個のスレッドを実行することになりました。私たちは次の3分間で何が起きるかを見て、それに基づいてスレッドを拡大します。

この1つのアプリケーションの拡大縮小は、私が雲の中で起こりたいと思うように完全に機能します。一度にすべてのスレッドの状態を見ることができます。各スレッドはキューアイテムの30個のバッチを処理し、各タスクは約2〜3秒かかるので、オーバーヘッドは非常に低いです。

今や明らかに落ち込んでいるのは、私たちが基本的な考え方に戻っていることです。私たちが利用しているクラウドインフラストラクチャは、単に仮想マシンに過ぎません。この1つのアプリがクラッシュしたり、コンピュータが再起動したらどうなりますか?処理能力がさらに必要な場合はどうなりますか?単一のWinFormアプリケーションを簡単に実行するにはどうすればよいですか? (私たちはoctopusのデプロイメントを使用し、Windowsサービスのみを提供します)どのように多分8つの異なるEXEがすべてデスクトップ上で動作しているのでしょうか?

私たちは現在の作業負荷に基づいて自動的に単一のスレッドをスケーリングできる、より良い方法が必要であることを知っています。これがクラウド上で実行される場所でも、VMを管理することによって制限されることはありません。

私はサービスファブリックで6時間の読書をしていましたが、それは正しい方向に向いているようですが、私たちのユースケースをカバーする1つの文書とこれを設定する最善の方法はまだ見つかりません。

単一のタスク(スレッド)のインスタンスを必要に応じて自動的にスケーリングするシステムを作成するにはどうしたらいいですか?各タスクが完了したら、不要になったためスピンダウンする必要があるかどうかを決定します。私は、これらのインスタンスをスピンアップする親のワーカーが必要であり、完了したらシャットダウンする必要があるかどうかをそれぞれ指示します。しかし、私はこのようなプロジェクトのコード化/ドキュメントを見つけることができません、それは紺碧を利用しています。

大文字のユースケースは、電子メールの送信者になります。
- 私たちには、いつメールを予定に入れて送信するアプリケーションがありますか。
- 次の30個のアイテムをキューに入れてすぐに取り出して送信できる、2番目のシングルスレッドアプリがあります。
- 誰かが今すぐキューに25,000アイテムを追加するとどうなりますか? 私たちはメールを外出したいと思いますが、 この1つのスレッドアプリを複数のインスタンスにするにはどうすればいいですか? 次に、完了したら不要になったスレッドをどのようにスケールダウンするのですか?

おかげ

+0

「Azure関数」を見ましたか?私が理解していることから、インフラストラクチャ自体の拡張について心配する必要はありません。 –

+0

私はサービスファブリックと同じように今週始めました。私はまだワークロード(キュー)に基づいて単一のインスタンスをどのようにスケールアウトするのかという中心的な問題にありますか?使い方に基づいてVMをスケーリングするのは簡単ですが、必要のないタスクを自動起動する/シャットダウンする方法はありますか? –

+1

私はAzure関数について簡単に読みましたが、私が理解していることは、あなたがそれを心配する必要がないということです。基本的には、ワークロードに基づいて自動的に拡大/縮小されるサーバーレスのインフラストラクチャ(Amazon Lambdaと同様)を提供します。基盤となるVMにアクセスする必要がある場合を除き、以下を使用することを強くお勧めします。https://azure.microsoft.com/en-us/blog/introducing-azure-functions/ 。 –

答えて

1

はあなたの問題は、インフラストラクチャを拡張する方法に関するものではありませんが、どのようにあなたの建築家、あなたの活動のワークフローです。キューが特定の時間(期限切れになったとき)にのみ処理され、追加されない場合は、キューに入れられた将来のワークロードではなく、現在のワークロードである2次キューを追加することを考えましたか?

次に、アイテムを消費したいときに、アイテムを保留キューから「アクティブ」キューに移動します。その時点で、インスタンスのスケーリングを使用して、アクティブなキューからワークロードを消費することができます。ワークロードを消費するために使用するプラットフォームは、機能、Webジョブ、バッチなどの選択肢です。ただし、ロジックアプリケーションを使用して、ワークフローの調整やキュー間のメッセージの移動を支援することができます。

+0

ラッセル、 私たちは実際にこれをやっています。私たちはずっと遠い将来に行くために常に必要なものであり、私はAzure Queuesで7日間信じるという限界があります。しかし、キューを拡大縮小するという問題が依然として発生しました。クラウドサービスを使用すると、単一のインスタンスを拡張するのに時間がかかりすぎたため、機能しませんでした。メッセージを今すぐに移動する必要があるとき(キューに入る準備が整ったとき)、新しいインスタンスを最終的にスケールアップするときに、5〜10分ではなく、今すぐ送信する必要があります。理想的には、関数などの新機能がより速く実行されます。 –

+0

まだキューを処理するにはワーカーの設定が必要ですが、データを1つから別のものに移動するのは非常に高速です。そのために別のアプリケーションを用意するだけです。しかし、それはまさに私が探しているものです。インスタンスを確実にインスタンス化する方法。機能を研究し続けるつもりです。うまくいけば、それはクラウドサービスよりもはるかに優れています。ありがとう。 –

+0

アプリケーションサービスと機能は、クラウドサービスよりもはるかに迅速に拡張可能です。 - コンテナは既に構築されており、すぐに使用できるため、お客様のVMをプロビジョニングし、展開してスピンアップする必要があります。これは高速化していますが、アプリケーションサービス/関数ほど速くはありません。 –

関連する問題