私は、Firebase DBの変更をリッスンし、それらの変更に基づいてロジックを実行することになる、サービス ファブリックで信頼できるアクターを作成しています。私はそれを機能させていますが、正しくはありません。これまでに行ったことは、 FireSharp と呼ばれる C# Firebase クライアント ラッパーを使用して Firebase をリッスンするMonitorRules () と呼ばれるメソッドを使用してアクター コードを作成することです。MonitorRules() は次のようになります。
public async Task MonitorRules()
{
FireSharp.FirebaseClient client = new FireSharp.FirebaseClient(new FireSharp.Config.FirebaseConfig
{
AuthSecret = "My5up3rS3cr3tAu7h53cr37",
BasePath = "https://myapp.firebaseio.com/"
});
await client.OnAsync("businessRules",
added: (sender, args) =>
{
ActorEventSource.Current.ActorMessage(this, $"{args.Data} added at {args.Path}");
},
changed: (sender, args) =>
{
ActorEventSource.Current.ActorMessage(this, $"{args.OldData} changed to {args.Data} at {args.Path}");
}
);
}
サービスが登録された後、サービスの Main() メソッドで次のように MonitorRules() を呼び出します。
fabricRuntime.RegisterActor<RuleMonitor>();
var serviceUri = new Uri("fabric:/MyApp.RuleEngine/RuleMonitorActorService");
var actorId = ActorId.NewId();
var ruleMonitor = ActorProxy.Create<IRuleMonitor>(actorId, serviceUri);
ruleMonitor.MonitorRules();
これは、サービスが Firebase への接続を開き、データの変更に応答するという点で「機能」します。問題は、サービスが 5 ノード クラスターの 3 つのノードで実行されるため、実際には 3 回リッスンし、各メッセージを 3 回処理することです。また、しばらく活動がない場合、サービスは非アクティブ化され、Firebase の変更に応答しなくなります。全体として、このようなものを設定する正しい方法ではないと確信していますが、サービス ファブリックでこのようなポーリング クライアントを設定する方法に関するドキュメントは見つかりません。Azure Service Fabric の精神に準拠するようにこれを設定する方法はありますか?