各ストリーム プロバイダー (Azure Queues、EventHub、SMS、SQS など) には、キュー固有の詳細と構成があります。 このセクションでは、 Orleans Azure Queue Streams の使用方法、構成、実装について詳しく説明します。 このセクションは包括的ではありません。 ストリーミング テストの詳細については、ほとんどの構成オプション (特に AQClientStreamTests と AQSubscriptionMultiplicityTests)、および IAzureQueueStreamConfigurator と ISiloPersistentStreamConfiguratorの拡張機能を含みます。
Orleans Azure Queue には Microsoft.Orleans が必要です。Streaming.AzureStorage NuGet パッケージ。 このパッケージには、実装に加えて、サイロ起動時の構成を簡略化する拡張メソッドが含まれています。 最小限の構成では、接続文字列を指定する必要があります。次に例を示します。
hostBuilder
.AddAzureQueueStreams("AzureQueueProvider", configurator =>
{
configurator.ConfigureAzureQueue(
ob => ob.Configure(options =>
{
options.ConnectionString = "[PLACEHOLDER]";
options.QueueNames = new List<string> { "yourprefix-azurequeueprovider-0" };
}));
configurator.ConfigureCacheSize(1024);
configurator.ConfigurePullingAgent(ob => ob.Configure(options =>
{
options.GetQueueMsgsTimerPeriod = TimeSpan.FromMilliseconds(200);
}));
})
// a PubSubStore could be needed, as example Azure Table Storage
.AddAzureTableGrainStorage("PubSubStore", options => {
options.ConnectionString = "[PLACEHOLDER]";
})
プルエージェントは、キューにメッセージがなくなるまで何度もプルし、その後、プルを再開する前に設定可能な期間待機します。 このプロセスは、キューごとに発生します。 内部的には、プル エージェントはコンシューマーに配信するためにキャッシュ (キューごとに 1 つのキャッシュ) にメッセージを配置しますが、キャッシュがいっぱいになると読み取りを停止します。 メッセージはコンシューマーが処理するとキャッシュから削除されるため、読み取り速度はコンシューマーの処理速度によってほぼ調整される必要があります。
既定では、 Orleans Azure Queue では 、8 個のキュー ( AzureQueueOptions を参照) と 8 個の関連するプル エージェント、 100 ミリ秒 の遅延 ( StreamPullingAgentOptions.GetQueueMsgsTimerPeriod を参照)、キャッシュ サイズ (IQueueCache) が 4096 メッセージ ( SimpleQueueCacheOptions.CacheSize を参照) が使用されます。
コンフィギュレーション
既定の構成は運用環境に合わせる必要がありますが、特別なニーズに合わせて、既定の動作を構成できます。 たとえば、開発用マシンでは、ポーリング エージェントの数を減らして 1 つのキューのみを使用できます。 これは、CPU 使用率とリソース負荷を軽減するのに役立ちます。
hostBuilder
.AddAzureQueueStreams<AzureQueueDataAdapterV2>(
"AzureQueueProvider",
optionsBuilder => optionsBuilder.Configure(
options =>
{
options.ConnectionString = "[PLACEHOLDER]";
options.QueueNames =
new List<string>
{
"yourprefix-azurequeueprovider-0"
};
}))
チューニング
運用システムでは、既定の構成の調整が必要になる場合があります。 一部の要素をチューニングする場合は、サービス固有の要素を考慮する必要があります。
- まず、ほとんどの設定はキューごとに行われるので、多数のストリームの場合は、より多くのキューを構成することで、各キューの負荷を軽減できます。
- ストリームはストリームごとにメッセージを順番に処理するため、ゲーティング係数は 1 つのストリームで送信されるイベントの数になります。
- キャッシュ時間 (StreamPullingAgentOptions.GetQueueMsgsTimerPeriod) と可視性時間 (AzureQueueOptions.MessageVisibilityTimeout) の適切なバランスは、メッセージがキャッシュ内にあると予想される時間の 2 倍に可視性を構成する必要があるということです。
例
次の特性を持つシステムを想定します。
- 100個のストリーム
- 10 個のキュー
- 各ストリームは、1 分あたり 60 個のメッセージを処理します。
- 各メッセージの処理には約 30 ミリ秒かかります。
- キャッシュ内のメッセージの 1 分分分 (キャッシュ時間)。
そのため、システムのいくつかのパラメーターを計算できます。
ストリーム/キュー: キュー間でストリームを均等化することは理想的であり、10 ストリーム/キュー (100 ストリーム/10 キュー) となります。 ただし、ストリームが常にキューに均等に分散されるとは限らないので、理想的な分散を期待するより、理想的な量を2倍(あるいは3倍)にする方が安全です。 そのため 、20 ストリーム/キュー (安全性係数として 10 ストリーム/キュー x 2) が妥当である可能性があります。
メッセージ/分: これは、各キューが最大 1200 メッセージ/分 (60 メッセージ x 20 ストリーム) を処理することが期待されることを意味します。
その後、使用する可視性の時間を決定できます。
- 可視性時間: キャッシュ時間 (1 分) は、1 分間のメッセージを保持するように構成されます (つまり、上記のメッセージ/分を計算するため、1200 メッセージ)。 各メッセージの処理には 30 ミリ秒かかると想定しました。その後、メッセージがキャッシュ内で最大 36 秒 (0.030 秒 x 1200 メッセージ = 36 秒) を費やすことが予想されるため、可視性時間は 72 秒 (キャッシュ x 2 では 36 秒) を超える必要があります。 したがって、より大きなキャッシュを定義する場合、より長い可視性時間が必要になります。
実際のシステムでの最後の考慮事項:
- 順序はストリームごとのみで、キューは多数のストリームを消費するため、メッセージは複数のストリームで並列に処理される可能性があります (たとえば、ストリームのグレインがあり、並列で実行できます)。 つまり、キャッシュの書き込み時間ははるかに短くなりますが、さらに悪いケースを計画しました。断続的な遅延や一時的なエラーの下でも、システムに十分に機能し続ける余地が与えられます。
そのため、次を使用して Azure Queue Streams を構成できます。
hostBuilder
.AddAzureQueueStreams("AzureQueueProvider", configurator => {
configurator.ConfigureAzureQueue(
ob => ob.Configure(options => {
options.ConnectionString = "[PLACEHOLDER]";
options.QueueNames = new List<string> {
"yourprefix-azurequeueprovider-1",
[...]
"yourprefix-azurequeueprovider-10",
};
options.MessageVisibilityTimeout = TimeSpan.FromSeconds(72);
}));
configurator.ConfigureCacheSize(1200);
})
.NET