我正在编写一个可靠的服务结构参与者,他的工作是监听Firebase 数据库中的变化并根据这些变化运行逻辑。我有它的功能,但不正确。到目前为止,我所做的是使用名为 MonitorRules() 的方法编写参与者代码,该方法使用名为 FireSharp 的 C# Firebase 客户端包装器来监听Firebase。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 的连接并响应数据更改。问题在于,由于该服务在一个五节点集群的三个节点上运行,它实际上是在侦听 3 次,并且每条消息处理 3 次。此外,如果一段时间内没有活动,该服务将被停用并且不再响应 Firebase 中的更改。总而言之,我敢肯定,设置这样的东西不是正确的方法,但我找不到任何关于如何在服务结构中设置这样的轮询客户端的文档。有没有一种方法可以坚持 azure service fabric 的精神?