.NET分布式Orleans计时器和提醒功能实现

 更新时间:2024年03月26日 10:05:38   作者:chester·chen  
Timer是一种用于创建定期粒度行为的机制,与标准的.NET System.Threading.Timer类相似,Orleans 的 Timer允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作,这篇文章主要介绍了.NET分布式Orleans 计时器和提醒,需要的朋友可以参考下

Timer是什么

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

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

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

Timer的注意事项

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

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

  • 每次 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 中用于处理周期性任务的机制,与计时器类似,但具有一些重要区别:

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

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

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

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

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

如果想使用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)的场景:

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

使用提醒(Reminder)的场景:

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

依赖注入创建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));
}

到此这篇关于.NET分布式Orleans - 4 - 计时器和提醒的文章就介绍到这了,更多相关.NET计时器和提醒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 使用.Net Core编写命令行工具(CLI)的方法

    使用.Net Core编写命令行工具(CLI)的方法

    这篇文章主要介绍了使用.Net Core编写命令行工具(CLI)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • ASP.NET MVC实现多选下拉框

    ASP.NET MVC实现多选下拉框

    这篇文章介绍了ASP.NET MVC实现多选下拉框的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 用C#中的params关键字实现方法形参个数可变

    用C#中的params关键字实现方法形参个数可变

    个人认为,提供params关键字以实现方法形参个数可变是C#语法的一大优点。在方法形参列表中,数组类型的参数前加params关键字,通常可以在调用方法时代码更加精练
    2012-01-01
  • Nginx配置实现下载文件的示例代码

    Nginx配置实现下载文件的示例代码

    这篇文章主要介绍了Nginx配置实现下载文件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • ASP.NET MVC重写RazorViewEngine实现多主题切换

    ASP.NET MVC重写RazorViewEngine实现多主题切换

    这篇文章主要为大家详细介绍了ASP.NET MVC重写RazorViewEngine实现多主题切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • asp.net利用google的api做翻译

    asp.net利用google的api做翻译

    google提供了一组API可以给我们很方便的实现语言翻译功能,对于我们(中国人)而言,常用的是中文与英文的互译。
    2009-05-05
  • asp.net webservice返回json的方法

    asp.net webservice返回json的方法

    webservice默认的返回为XML 要返回json可以用json工具类把对象转为json字符串,需要的朋友可以参考下
    2014-02-02
  • .NET Core中使用gRPC的方法

    .NET Core中使用gRPC的方法

    gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统,所以叫g(google)RPC,这篇文章主要介绍了.NET Core中使用gRPC,需要的朋友可以参考下
    2022-09-09
  • .net发送邮件实现代码

    .net发送邮件实现代码

    代码基本上可以实现邮件的发送,但是在测试时却在 smtp.Send(objMail);处显示“发送邮件失败”,最后发现的问题是,我的杀毒软件对邮件发送接收进行了保护,只需去掉保护就能够发送成功了。
    2009-02-02
  • ASP.NET Core中MVC模式实现路由一

    ASP.NET Core中MVC模式实现路由一

    这篇文章介绍了ASP.NET Core中MVC模式实现路由的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论