首页 > 其他分享 >.NET分布式Orleans - 4 - 计时器和提醒

.NET分布式Orleans - 4 - 计时器和提醒

时间:2024-03-26 09:23:14浏览次数:34  
标签:提醒 Orleans Task TimeSpan Timer Grain 计时器 NET

Timer是什么

Timer 是一种用于创建定期粒度行为的机制。

与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作。

它在分布式系统中具有重要作用,特别是在处理需要周期性执行的任务时非常有用。

Timer的注意事项

  1. 计时器回调不会改变空闲激活的状态,不能用于推迟其他空闲激活的停用。

  2. Grain.RegisterTimer 中传递的时间段取决于上次回调完成到下一次回调开始的时间,因此回调的频率会受到执行时间的影响。

  3. 每次 asyncCallback 调用都会作为单独轮次的激活,并且不会与同一激活的其他轮次同时运行。

代码示例

public class PlayerGrain : Grain, IPlayerGrain
{
    public Task<string> GetPlayerInfo()
    {
        var timer = RegisterTimer(DoSomething, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
        return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
    }

    private async Task DoSomething(object state)
    {
        // 在这里定义要执行的操作
        await Task.Delay(5000);
        Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Timer Triggered: {this.GetPrimaryKeyString()}");
    }
}

Reminder与Timer的区别

提醒(Reminder)是一种在 Orleans 中用于处理周期性任务的机制,与计时器类似,但具有一些重要区别:

  1. 永久性触发:提醒是永久性的,除非明确取消,否则会在几乎所有情况下(包括部分或完整群集重启)继续触发。

  2. 定义的持久性:提醒的定义会写入存储,但具体的事件及其时间不会。这意味着如果群集在提醒应该触发时关闭,它将错过该提醒,只会在下次提醒的触发时被重新激活。

  3. 关联于Grain:提醒是与Grain关联的,而不是与任何特定激活Grain。如果提醒的触发时,粒度没有与之关联的激活,则会创建该Grain,并在下次触发时重新激活。

  4. 消息传递:提醒的传递通过消息发生,受到与所有其他粒度方法相同的交错语义的约束。

  5. 适用场景:提醒通常不适用于高频计时器,其周期应该以分钟、小时或天为单位。相比之下,提醒更适用于周期性任务的处理,例如定期执行清理任务或发送通知等。

如果想使用reminder,需要安装nuget包

<PackageReference Include="Microsoft.Orleans.Reminders" Version="8.0.0" />

并开启reminder

silBuilder.UseInMemoryReminderService();

Grain需要实现接口 IRemindable ,并使用this.RegisterOrUpdateReminder 注册reminder

public interface IPlayerGrain : IGrainWithStringKey, IRemindable
{
    Task<string> GetPlayerInfo();
}

public class PlayerGrain : Grain, IPlayerGrain
{
    public Task<string> GetPlayerInfo()
    {
        this.RegisterOrUpdateReminder("myReminder", TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
        return Task.FromResult($"Player ID: {this.GetPrimaryKeyString()}");
    }

    public Task ReceiveReminder(string reminderName, TickStatus status)
    {
        Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Reminder Triggered: {this.GetPrimaryKeyString()}");return Task.CompletedTask;
    }
}

Timer 和 Reminder 场景

使用定时器(Timer)的场景:

  1. 对激活状态的要求不高:如果激活被停用或发生故障时,计时器停止运行不会产生重大影响,或者这种行为可接受。
  2. 较小的分辨率:如果需要较小的时间间隔来执行任务,例如以秒或分钟为单位。
  3. 计时器回调与 Grain 生命周期相关:如果需要在 Grain 的生命周期事件(如OnActivateAsync())或者调用粒度方法时启动计时器回调。

使用提醒(Reminder)的场景:

  1. 持久性要求:当需要确保周期性行为在激活和任何故障中都存在时,提醒是一个更好的选择。因为提醒是永久性的,除非明确取消,否则会在几乎所有情况下继续触发。
  2. 较大的时间间隔:当执行不常见的任务,例如以分钟、小时或天为单位的周期性任务时,提醒更为适合。

依赖注入创建Timer与Reminder

将 ITimerRegistry 或 IReminderRegistry 注入粒度的构造函数中,也可以创建Timer与Reminder

public PlayerGrain(ITimerRegistry timerRegistry,
IReminderRegistry reminderRegistry,
IGrainContext grainContext)
{
    timerRegistry.RegisterTimer(grainContext,DoSomething,null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
    reminderRegistry.RegisterOrUpdateReminder(grainContext.GrainId,"testreminder",TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1));
}

 

标签:提醒,Orleans,Task,TimeSpan,Timer,Grain,计时器,NET
From: https://www.cnblogs.com/chenyishi/p/18094375

相关文章

  • Profinet转Modbus网关的调试与故障排除教程
    Profinet转Modbus网关(XD-MDPN100)带有网口和串口很大限度地解决了设备接口不统一的问题,支持485和232,可以实现从Modbus通信协议到Profinet通信协议的无缝转换,为不同协议之间的互联互通提供了便利。Profinet转Modbus网关(XD-MDPN100)的调试与故障排除教程通常涉及一系列步骤来确保网......
  • Kubernetes网络原理
    Kubernetes的网络依赖于Docker,Docker的网络又离不开Linux操作系统内核特性的支持,所以在学习Kubernetes网络原理之前,有必要先深入了解Docker相关的网络基础知识,以及Docker的网络实现原理,详见《Docker的Linux网络基础》与《Docker网络原理》。 一、Kubernetes网......
  • openwrt netdata 温度监控
    1、安装timeout:opkginstallcoreutils-timeout2、进入/etc/netdata3、使用./edit-configcharts.d.conf来编辑配置文件,这个edit-config等于是一个配置工具能够从/usr/lib拉取默认配置过来,在配置里最后加入sensors=force。不加一定不会有温度,原因未知。4、用/usr/lib/netdata/p......
  • 论文解读(UDA-GCN)《Unsupervised Domain Adaptive Graph Convolutional Networks》
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:UnsupervisedDomainAdaptiveGraphConvolutionalNetworks论文作者:论文来源:2020aRxiv论文地址:download 论文代码:download视屏讲解:click1-摘要图卷积网络(GCNs)在许多与图相关的分析任务中都取得了令人印......
  • Kubernetes知识整理
    Kubernetes知识整理Kubernetes组件Kubernetes由多个组件组成,共同协作以管理容器化应用程序。这些组件可以分为以下几类:控制平面组件API服务器(kube-apiserver):KubernetesAPI的入口点,负责处理来自客户端的请求并协调集群状态。调度器(kube-scheduler):负责将Pod分配......
  • 记一次 .NET某半导体CIM系统 崩溃分析
    一:背景1.讲故事前些天有一位朋友在公众号上找到我,说他们的WinForm程序部署在20多台机器上,只有两台机器上的程序会出现崩溃的情况,自己找了好久也没分析出来,让我帮忙看下怎么回事,就喜欢这些有点调试基础的,dump也不需要我指导怎么去抓,接下来我们就上windbg开始分析吧。二:WinDbg分......
  • .netcore获得swagger对象信息(解析swagger的json文件)
    以下代码未经测试,谨慎使用!!! varreader=newMicrosoft.OpenApi.Readers.OpenApiStringReader();vardoc=reader.Read(System.IO.File.ReadAllText(_webHostEnvironment.WebRootPath+"/a.json"),outvardiagnostic);vardoc1=_swaggerGenerator.GetSwagger(versio......
  • ASP.NET Core 图片转 PDF
    前几天用DocNETPDF转图片,现在再用DocNET把图片合并回PDF…使用DocNET:https://github.com/GowenGit/docnetNuget:Install-PackageDocnet.Core合并比拆分简单:publicstaticboolImages2Pdf(List<string>imageList,stringoutputPath){boolr......
  • 在 .NET 中使用 OPC UA 协议
    目录什么是OPCUAUaExpert的使用下载UaExpert首次启动添加OPCUA服务器连接OPCUA服务器查看PLC数据使用C#读写OPCUA数据连接到OPCUA服务器获取节点的值写入节点的值什么是OPCUAOPCUA(OPCUnifiedArchitecture,开放平台通信统一架构)是OPC基金会应用在自动......
  • Deepin-DotnetSdk安装
    Linux-DotnetSdk安装1.1密钥下载sudowget-Uvhhttps://packages.microsoft.com/config/debian/10/packages-microsoft-prod1.2执行密钥双击:packages-microsoft-prod.deb更新:sudoapt-getupdate1.3安装SDKsudoapt-getinstalldotnet-sdk-8.0sudoapt-getinstalldotn......