长时间运行的服务结构参与者提醒回调

Posted

技术标签:

【中文标题】长时间运行的服务结构参与者提醒回调【英文标题】:Long-running service fabric actor reminder callback 【发布时间】:2021-03-03 02:16:07 【问题描述】:

我有一个 SF actor 服务,其工作方式大致如下:

    RunAsync 中启动时,服务会创建一组预定义的actor,并通过调用一个空的StartAsync 方法(在IActor 派生的自定义接口上定义)激活所有这些actor。 每个参与者都会覆盖 OnActivateAsync,在其中注册提醒,dueTimeperiod 都设置为 10 秒。 演员在IRemindable.ReceiveReminderAsync 实现中完成所有工作。这项工作通常很快(约 100 毫秒),但有时可能会持续几分钟(我知道这是糟糕的设计,请不要对此发表评论:-))。

我的问题是:提醒到期时会发生什么,但演员仍然执行之前的回调代码?

According to the documentation,回调是排队的,但我也想知道队列是否以某种方式受到限制,达到限制时会发生什么?

感谢您的反馈!

帕洛

【问题讨论】:

【参考方案1】:

我浏览了 SF Actors 框架源代码 (ActorReminder.cs) 并找到了答案(感谢开源的美丽 :-):

当提醒到期,但参与者仍然执行之前的回调代码时会发生什么?

实际上,这永远不会发生。原因是ActorReminder 类使用System.Threading.Timer 类通过Change 方法重载来触发提醒,该方法使用Timeout.InfiniteTimeSpan 作为其period 参数。这意味着您的提醒回调可以执行几个小时,SF 会很高兴地等待它完成而不会抱怨。提醒回调完成后,ActorReminder 将在您注册提醒时指定的到期时间“重新启动”计时器。

这也意味着没有排队提醒回调之类的东西,这显然回答了我的第二个问题:-)。

【讨论】:

以上是关于长时间运行的服务结构参与者提醒回调的主要内容,如果未能解决你的问题,请参考以下文章

雪花警报长时间运行的查询

带有回调示例的线程不起作用。

接收来自 emqx 推送消息的长时间运行服务

使用登录用户长时间运行的 Windows 服务

服务结构参与者提醒和重复消息

使用异步服务器的长时间运行任务