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