3

我正在编写一个可靠的服务结构参与者,他的工作是监听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 的精神?

4

1 回答 1

7

是的,这里有一些事情要让你自己熟悉。首先是Actor 生命周期和垃圾收集。Tl;dr:如果 Actor 在一段时间内没有收到客户端请求(通过 ActorProxy)或提醒,则 Actor 将被停用,这是可配置的。

其次,Actor 具有计时器和提醒,您可以使用它们来执行定期工作,例如轮询数据库以进行更改。计时器和提醒之间的区别在于计时器不计为“正在使用”,这意味着演员仍然可以被停用从而关闭计时器,但提醒算作“正在使用”并且还可以重新激活停用的演员。考虑计时器和提醒的方式是您正在进行轮询,而不是等待来自其他类似 FireSharp 的回调。

最后,从 Main() 调用 MonitorRules 并不是最好的主意。原因是 Main() 实际上是你的 actor 服务宿主进程的入口点,它只是一个用于托管你的 actor 实例的 EXE。Main() 中唯一应该发生的事情就是注册您的演员类型,仅此而已。让我们更详细地看看这里发生了什么:

因此,您将参与者服务部署到集群。发生的第一件事是我们在运行参与者服务所需的尽可能多的节点上启动主机进程(在您的情况下是 3)。我们进入 Main() 注册演员服务类型的地方,此时,这就是我们应该做的,因为一旦演员服务注册到主机进程,我们将创建一个实例(或多个实例或副本,如果它是stateful) 的服务,然后服务可以开始工作。对于演员,这意味着当客户端应用程序使用 ActorProxy 进行调用时,演员服务已准备好开始激活演员。但是使用 Main() 中的 ActorProxy 调用,您基本上是在说“在主机启动时在该主机所在的每个节点上激活一个参与者“这就是为什么你要听三遍。

考虑到这一切,首先要问自己的问题是演员是否适合你。如果您只是想要一个使用 FireSharp 客户端监控 Firebase 的简单地方,那么使用可靠的服务可能会更容易,因为您可以将监控放在 RunAsync 中,它会在服务启动时自动启动,这与需要客户端的参与者不同激活它们。

于 2015-12-29T19:03:58.110 回答