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));
}

.NET分布式Orleans - 4 - 计时器和提醒的更多相关文章

  1. Orleans核心功能

    一.Grain持久性 二.定时器和提醒 三.依赖注入 四.观察者 五.无状态工作者Grains 六.流 一.Grain持久化 1,Grain持久化目标 ①允许不同类型的存储提供者使用不同类型的存储提供 ...

  2. Orleans 框架3.0 官方文档中文版系列一 —— 概述

    关于这个翻译文档的一些说明: 之前逛博客园的时候,看见有个园友在自己的博客上介绍Orleans. 觉得Orleans 是个好东西. 当时心想:如果后面有业务需要的时候可以用用Orleans框架. 当真 ...

  3. .NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构一)--学习笔记

    目录 为什么我们用 Orleans Dapr VS Orleans Actor 模型 Orleans 的核心概念 为什么我们用 Orleans 分布式系统开发.测试的难度(服务发现.通信) 运维的复杂 ...

  4. Orleans简单配置

    Orleans简单配置 这是Orleans系列文章中的一篇.首篇文章在此 话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"-用ini或者jso ...

  5. C语言Windows程序设计—— 使用计时器

    传统意义上的计时器是指利用特定的原理来测量时间的装置, 在古代, 常用沙漏.点燃一炷香等方式进行粗略的计时, 在现代科技的带动下, 计时水平越来越高, 也越来越精确, 之所以需要进行计时是在很多情况下 ...

  6. 浅析 Dapr 里的云计算设计模式

    Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合,特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime ...

  7. 技术分享:Dapr,让开发人员更轻松地构建微服务应用

    最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

  9. 面向.NET开发人员的Dapr- actors 构建块

    原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...

  10. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

随机推荐

  1. 深入 Nginx 之架构篇[转]

    前言 最近在读 Nginx 相关的书籍,做一下读书笔记. Nginx 作为业界知名的高性能服务器,被广泛的应用.它的高性能正是由于其优秀的架构设计,其架构主要包括这几点:模块化设计.事件驱动架构.请求 ...

  2. STM32F401的PWM输出

    PWM的说明 PWM有三个关键指标: PWM频率, 占空比, 区分度 对于同一个时钟频率下工作的单片机, 区分度是和PWM工作频率相关的, 因为总频率是固定的, PWM工作频率越高, 留下给区分度的部 ...

  3. centos7搭建postgresql主从(主备)架构

    本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构.后续更高级的HA模式都是基于这个最基本的主备搭建. 节点规划 ip 主机名 用途 192.168.18 ...

  4. Spring Boot图书管理系统项目实战-11.检索图书

    导航: pre:10.借还统计 next: 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 index.html <!D ...

  5. Spring Security实现JDBC用户登录认证

    在搭建博客后端服务框架时,我采用邮件注册+Spring Security登录认证方式,结合mysql数据库,给大家展示下具体是怎么整合的. 本篇是基于上一篇:spring boot实现邮箱验证码注册 ...

  6. Java I/O 教程(六) BufferedInputStream 类

    Java BufferedInputStream Class Java BufferedInputStream class 用于从输入流读取数据,和BufferedOutStream一样内部使用缓冲机 ...

  7. F - Subarrays题解

    F - Subarrays 题意:给你一个序列,问这个序列里有多少个子串的和能被k整除. 思路:求前缀和,然后每个位置对k取模,模数相等的位置之间,是一个满足条件的字串. 因为求的是前缀和,所以取模后 ...

  8. [BUUCTF][WEB][极客大挑战 2019]PHP 1

    打开靶机URL 看到字面提示 因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯不愧是我!!! 说明该网站有备份,说不定放在了Http服务器的某个目录下 那么这里我们可以用dirsearc ...

  9. pinia

    Pinia学习 Vue3中 使用 官网:https://pinia.web3doc.top/introduction.html 安装 yarn add pinia # 或者使用 npm npm ins ...

  10. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...