私はサービス ファブリックを初めて使用するため、用語についてはご容赦ください。オンプレミスの Service Fabric を使用する 3 ノード クラスターがあります (たとえば、Azure でホストされていません)。
Rabbit MQ からメッセージをプルし、ビジネス ロジック処理のためにアクターに渡すステートレス サービスがあります。
Power Shell を使用してアプリケーションとサービスを作成する場合、最初にアプリケーションを強制的に削除します。
Remove-ServiceFabricApplication -ApplicationName $applicationName -Force
次に、名前/タイプとイメージ バージョンを使用して、新しいサービス ファブリック アプリケーションを作成します。
New-ServiceFabricApplication `
-ApplicationName $applicationName `
-ApplicationTypeName $applicationType `
-ApplicationTypeVersion $version
最後に、サービスを作成します。
# Create Actor Service
$lowkey = "-9223372036854775808"
$highkey = "9223372036854775807"
New-ServiceFabricService `
-ApplicationName $applicationName `
-ServiceTypeName 'AlarmsProcessingActorServiceType' `
-Stateful `
-ServiceName ($applicationName + '/AlarmsProcessingActorService') `
-PartitionSchemeUniformInt64 `
-HasPersistedState `
-LowKey $lowkey `
-HighKey $highkey `
-PartitionCount $nodeCount `
-MinReplicaSetSize 1 `
-TargetReplicaSetSize 1 `
-ServicePackageActivationMode ExclusiveProcess
Start-Sleep -s 10
# Create Stateless Service
New-ServiceFabricService `
-ApplicationName $applicationName `
-ServiceName ($applicationName + '/AlarmsService') `
-ServiceTypeName 'AlarmsType' `
-InstanceCount 1 `
-Stateless `
-PartitionSchemeSingleton
したがって、各ノードでアクターの 5 つのインスタンス/レプリカを作成しています。VM を使用している場合、負荷がない場合、各アクターのメモリ使用量は 50 MB 未満です。
次のパワー シェル スクリプトを実行してサービスを停止および開始する (基本的にサービスを再作成する) が、アプリケーションを再作成しない場合、同じアクターが開始され、メモリがすぐに 140 MB 以上になることに気付きます。 .
私のアクターの実装には永続的な状態がありません。
[StatePersistence(StatePersistence.None)]
public class AlarmsProcessingActor : Actor, IAlarmsProcessingActor
以下の NuGet パッケージを使用しています
Autofac 5.2.0 Autofac.ServiceFabric 3.0.0 Microsoft.ServiceFabric.Actors 4.1.456
私たちのクラスターはコードバージョンを実行しています: 7.2.457.9590
私はメモリ ダンプを取得しようとしましたが、winDBG を使用している人の頭や話をするのに十分な知識がありません。ANTSメモリプロファイラ11を使って解析してみましたが、やはり何を見ているのかわかりません。
アクターの起動時に、アプリケーション内の別のマイクロ サービスから構成 (db 接続文字列、およびその他の設定) を取得し、これらすべてを autofac コンテナー ビルダーに格納します。次に、アクターを常に実行し続けるために、次のことを行います。続く:
// Get config based on params
var envConfig = FabricConfigFactory.Build();
// IoC Dependencies
var builder = AutofacBuilderFactory.Build(envConfig);
// Add rabbit autofac config
RabbitAutofacBuilder.RegisterRabbitConfig(builder);
ActorServiceSettings settings = new ActorServiceSettings()
{
ActorGarbageCollectionSettings = new ActorGarbageCollectionSettings(10, 2) //if the actor is idle for 10 seconds, checking every 2 seconds, then GC will take place.
};
// Register Fabric Services
builder.RegisterActor<AlarmsProcessingActor>(null, null, null, settings, null);
// Register the Autofac magic for Service Fabric support.
builder.RegisterServiceFabricSupport();
using (var scope = builder.Build())
{
// Prevents this host process from terminating so services keep running.
Thread.Sleep(Timeout.Infinite);
};
最終的に、アプリケーションを最初に作成したときはメモリ使用量が問題ないように見えるのに、アプリケーションを変更せずにサービスを削除/作成した後、アプリケーションの負荷が増加することなく、メモリが最大 3 倍以上増加するように見える理由を理解するのに役立ちたいと思います。