Azure service fabric 如何在ServiceFabric(azure)中注册侦听器

Azure service fabric 如何在ServiceFabric(azure)中注册侦听器,azure-service-fabric,Azure Service Fabric,我正在为ServiceFabric编写一个可靠的参与者,他的工作是倾听服务中的更改,并基于这些更改运行逻辑。我有它的功能,但不正确。到目前为止,我所做的是使用一个名为MonitorRules()的方法编写actor代码,该方法使用一个名为。MonitorRules()如下所示: public async Task MonitorRules() { FireSharp.FirebaseClient client = new FireSharp.FirebaseClient(new Fire

我正在为ServiceFabric编写一个可靠的参与者,他的工作是倾听服务中的更改,并基于这些更改运行逻辑。我有它的功能,但不正确。到目前为止,我所做的是使用一个名为MonitorRules()的方法编写actor代码,该方法使用一个名为。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}");
        }
    );            
}
然后在服务注册后调用MonitorRules(),就像在服务的Main()方法中一样:

FabriRuntime.RegisterActor();
var serviceUri=newuri(“结构:/MyApp.RuleEngine/RuleMonitorActorService”);
var actorId=actorId.NewId();
var ruleMonitor=ActorProxy.Create(actorId,serviceUri);
ruleMonitor.monitorules();

这“起作用”是因为该服务打开与Firebase的连接,并响应数据更改。问题在于,由于该服务在五节点集群的三个节点上运行,因此它实际上会侦听三次,并对每条消息进行三次处理。此外,如果有一段时间没有活动,该服务将被停用,不再响应Firebase中的更改。总而言之,我确信这不是设置此类内容的正确方法,但我在ServiceFabric中找不到任何关于如何设置此类轮询客户端的文档。有没有一种方法可以使它符合azure service fabric的精神?

是的,这里有一些东西需要您熟悉。第一个是。Tl;dr:如果参与者在一段时间内没有收到客户端请求(通过ActorProxy)或提醒,那么参与者将被停用,这是可配置的

第二,参与者具有可用于执行定期工作的功能,如轮询数据库以获取更改。计时器和提醒之间的区别在于,计时器不算作“正在使用”,这意味着仍然可以停用参与者,从而关闭计时器,但提醒算作“正在使用”,也可以重新激活停用的参与者。考虑计时器和提醒的方式是,您正在进行轮询,而不是等待来自FireSharp的其他东西的回调

最后,从Main()调用monitorules不是最好的主意。原因是Main()实际上是actor服务主机进程的入口点,它只是一个用于承载actor实例的EXE。Main()中唯一应该做的事情是注册参与者类型,而不是其他。让我们更详细地看看这里发生了什么:

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


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

在所有方面都做了出色的说明。我无法告诉你这有多大帮助。
fabricRuntime.RegisterActor<RuleMonitor>();
var serviceUri = new Uri("fabric:/MyApp.RuleEngine/RuleMonitorActorService");
var actorId = ActorId.NewId();
var ruleMonitor = ActorProxy.Create<IRuleMonitor>(actorId, serviceUri);

ruleMonitor.MonitorRules();