长时间运行的服务结构参与者提醒回调
Posted
技术标签:
【中文标题】长时间运行的服务结构参与者提醒回调【英文标题】:Long-running service fabric actor reminder callback 【发布时间】:2021-03-03 02:16:07 【问题描述】:我有一个 SF actor 服务,其工作方式大致如下:
-
在
RunAsync
中启动时,服务会创建一组预定义的actor,并通过调用一个空的StartAsync
方法(在IActor
派生的自定义接口上定义)激活所有这些actor。
每个参与者都会覆盖 OnActivateAsync
,在其中注册提醒,dueTime
和 period
都设置为 10 秒。
演员在IRemindable.ReceiveReminderAsync
实现中完成所有工作。这项工作通常很快(约 100 毫秒),但有时可能会持续几分钟(我知道这是糟糕的设计,请不要对此发表评论:-))。
我的问题是:提醒到期时会发生什么,但演员仍然执行之前的回调代码?
According to the documentation,回调是排队的,但我也想知道队列是否以某种方式受到限制,达到限制时会发生什么?
感谢您的反馈!
帕洛
【问题讨论】:
【参考方案1】:我浏览了 SF Actors 框架源代码 (ActorReminder.cs
) 并找到了答案(感谢开源的美丽 :-):
当提醒到期,但参与者仍然执行之前的回调代码时会发生什么?
实际上,这永远不会发生。原因是ActorReminder
类使用System.Threading.Timer
类通过Change
方法重载来触发提醒,该方法使用Timeout.InfiniteTimeSpan
作为其period
参数。这意味着您的提醒回调可以执行几个小时,SF 会很高兴地等待它完成而不会抱怨。提醒回调完成后,ActorReminder
将在您注册提醒时指定的到期时间“重新启动”计时器。
这也意味着没有排队提醒回调之类的东西,这显然回答了我的第二个问题:-)。
【讨论】:
以上是关于长时间运行的服务结构参与者提醒回调的主要内容,如果未能解决你的问题,请参考以下文章