.NET分布式Orleans計時器和提醒功能實現(xiàn)
Timer是什么
Timer 是一種用于創(chuàng)建定期粒度行為的機制。
與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間后執(zhí)行特定的操作,或者在特定的時間間隔內(nèi)重復執(zhí)行操作。
它在分布式系統(tǒng)中具有重要作用,特別是在處理需要周期性執(zhí)行的任務時非常有用。
Timer的注意事項
計時器回調(diào)不會改變空閑激活的狀態(tài),不能用于推遲其他空閑激活的停用。
Grain.RegisterTimer 中傳遞的時間段取決于上次回調(diào)完成到下一次回調(diào)開始的時間,因此回調(diào)的頻率會受到執(zhí)行時間的影響。
每次 asyncCallback 調(diào)用都會作為單獨輪次的激活,并且不會與同一激活的其他輪次同時運行。
代碼示例
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) { // 在這里定義要執(zhí)行的操作 await Task.Delay(5000); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} Timer Triggered: {this.GetPrimaryKeyString()}"); } }
Reminder與Timer的區(qū)別
提醒(Reminder)是一種在 Orleans 中用于處理周期性任務的機制,與計時器類似,但具有一些重要區(qū)別:
永久性觸發(fā):提醒是永久性的,除非明確取消,否則會在幾乎所有情況下(包括部分或完整群集重啟)繼續(xù)觸發(fā)。
定義的持久性:提醒的定義會寫入存儲,但具體的事件及其時間不會。這意味著如果群集在提醒應該觸發(fā)時關閉,它將錯過該提醒,只會在下次提醒的觸發(fā)時被重新激活。
關聯(lián)于Grain:提醒是與Grain關聯(lián)的,而不是與任何特定激活Grain。如果提醒的觸發(fā)時,粒度沒有與之關聯(lián)的激活,則會創(chuàng)建該Grain,并在下次觸發(fā)時重新激活。
消息傳遞:提醒的傳遞通過消息發(fā)生,受到與所有其他粒度方法相同的交錯語義的約束。
適用場景:提醒通常不適用于高頻計時器,其周期應該以分鐘、小時或天為單位。相比之下,提醒更適用于周期性任務的處理,例如定期執(zhí)行清理任務或發(fā)送通知等。
如果想使用reminder,需要安裝nuget包
<PackageReference Include="Microsoft.Orleans.Reminders" Version="8.0.0" />
并開啟reminder
silBuilder.UseInMemoryReminderService();
Grain需要實現(xiàn)接口 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)的場景:
- 對激活狀態(tài)的要求不高:如果激活被停用或發(fā)生故障時,計時器停止運行不會產(chǎn)生重大影響,或者這種行為可接受。
- 較小的分辨率:如果需要較小的時間間隔來執(zhí)行任務,例如以秒或分鐘為單位。
- 計時器回調(diào)與 Grain 生命周期相關:如果需要在 Grain 的生命周期事件(如OnActivateAsync())或者調(diào)用粒度方法時啟動計時器回調(diào)。
使用提醒(Reminder)的場景:
- 持久性要求:當需要確保周期性行為在激活和任何故障中都存在時,提醒是一個更好的選擇。因為提醒是永久性的,除非明確取消,否則會在幾乎所有情況下繼續(xù)觸發(fā)。
- 較大的時間間隔:當執(zhí)行不常見的任務,例如以分鐘、小時或天為單位的周期性任務時,提醒更為適合。
依賴注入創(chuàng)建Timer與Reminder
將 ITimerRegistry 或 IReminderRegistry 注入粒度的構(gòu)造函數(shù)中,也可以創(chuàng)建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計時器和提醒內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
asp.net core MVC 過濾器之ActionFilter過濾器(2)
這篇文章主要為大家詳細介紹了asp.net core MVC過濾器之ActionFilter過濾器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08asp.net jquery無刷新分頁插件(jquery.pagination.js)
采用Jquery無刷新分頁插件jquery.pagination.js 實現(xiàn)無刷新分頁效果:本示例Handler中采用StringBuilder的append方法追加HTML,小數(shù)據(jù)量可以,但是大數(shù)據(jù)或是布局常變,建議返回JSON格式的數(shù)據(jù),性能和靈活性更好,望使用者好好把握2013-01-01.NET?Core分布式鏈路追蹤框架的基本實現(xiàn)原理
這篇文章介紹了.NET?Core分布式鏈路追蹤框架的基本實現(xiàn)原理,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-03-03ASP.NET使用WebService實現(xiàn)天氣預報功能
這篇文章主要為大家詳細介紹了ASP.NET使用WebService實現(xiàn)天氣預報功能的相關資料,感興趣的小伙伴們可以參考一下2016-08-08sqlserver 批量數(shù)據(jù)替換助手V1.0版發(fā)布
前段時間網(wǎng)站被掛馬,數(shù)據(jù)庫表中很多文本字段都被加上了一段js腳本。修復完程序漏洞之后便開始著手清理這些被注入的數(shù)據(jù),其間參考了一些網(wǎng)上的方法,大都是寫一個存儲過程進行一個表一個表逐一清理。2011-10-10