1

worker ロールのインスタンスが 2 つあります。

ワーカー ロール インスタンスの 1 つだけで (スレッド プール スレッドで) サブタスクを実行したいと考えています。

私の最初のアイデアは、次のようなことをすることでした:

ThreadPool.QueueUserWorkItem((o) =>
{
    if (RoleEnvironment.CurrentRoleInstance.Id == RoleEnvironment.Roles[RoleEnvironment.CurrentRoleInstance.Role.Name].Instances.First().Id)
    {
        emailWorker.Start();
    }
});

Role.Instancesただし、上記のコードはコレクションが常に同じ順序でインスタンスを返すことに依存しています。これは事実ですか?または、アイテムは任意の順序で返品できますか?

1 つのロール インスタンスのみでタスクを実行する承認された別の方法はありますか?

4

2 に答える 2

1

ジョー、あなたが探しているソリューションは通常、以下に依存しています。

  • ロールインスタンス間の同期ポイントとしてBlobStorageを使用して、特定のBLOBでリース(ロックに似ていますが、有効期限があります)で取得します。
  • または、キューストレージからのメッセージのキューイング/デキューイング。これは通常、電子メールの送信などの長時間実行される操作を遅らせるために推奨されるパターンです。

いずれにせよ、Azure Storageを機能させるには、AzureStorageを経由する必要があります。この種の状況を処理するためにこのオープンソースフレームワークを正確に設計したので、 Lokad.Cloudを確認することをお勧めします。

于 2010-02-06T10:39:59.697 に答える
0

彼らが別のことをする必要がある場合、単一のワーカーロールのインスタンスが 2 つないように思えます。実際には、2 つの異なるワーカー ロールがあります。

特にアプリケーションのスケーラビリティを検討する場合、プロセスは複数のインスタンスで実行できる必要があります。1 つのロールでのみ実行したいタスクが大きくなり、2 つ以上のロール インスタンスにスケーリングする必要がある場合はどうなりますか?

Azure 向けに開発する利点の 1 つは、アプリを適切に設計すると、自動的にスケーラビリティが得られることです。スケーラブルではないものを取得するために余分な作業が必要になる場合、それがあなたがやろうとしていることです。

このタスクを開始するトリガーは何ですか? Queue Storage でメッセージを使用する場合 (Joannes の提案による)、1 つの worker ロールのみがメッセージを取得して処理し、worker ロールのどのインスタンスがそれを行うかは問題ではありません。

したがって、今のところ、サブタスクを実行する 1 つのワーカー ロールと、それ以外のすべてを実行する別のワーカー ロールがある場合は、Azure ソリューションに 2 つのワーカー ロールを追加するだけです。ただし、その場合でも、サブタスクを処理する worker ロールは、複数のインスタンスを実行するようにスケーリングした場合に適切に実行されるように記述する必要があります。その場合は、サブタスクを開始するためにキューからメッセージを処理するための単一のワーカー ロールとコードに固執することもできます。

于 2010-04-15T18:10:13.030 に答える