2026年5月11日 星期一

透過BackgroundService 處理背景任務

這陣子看到一個有趣的文章,若背景執行的服務或是排程,只要是主機掛掉,其實都會較慢被發現,

故有人提出也許可以跟站台放在一起,若站台掛點應該很快就知道...



看了一下文章,挺有趣的自己也來試試


我們先設計 QueuedBackgroundService 類別並且繼承 BackgroundService 類別,其中會

覆寫 ExecuteAsync() 方法



使用方式為在 Program 註冊,並且透過 AddHostedService 方式注入


啟動後的效果為


值得注意的是,為何證明QueuedBackgroundService 有活著,其中我們有加入一個TaskQueue 物件,

當使用者加入任務時,就會從這邊取出並且顯示任務





而TaskQueue 必須註冊為 Singleton ,這樣站台就會共用,後續我們會透過 api 來加入任務


Api Controller


其中 Accepted 回傳的 HttpStausCode 為 202,代表收到了,但還沒處理完(非同步操作,工作交給背景去跑)





以上就是等待任務進來


其中 IBackgroundTaskQueue 是可以置換的,因為我們現在內容是使用類似 In-memory 的方式,

來紀錄任務,若站台掛點紀錄的任務就會消失,故可以置換成 Redis或是企業級Azure Service Bus / RabbitMQ,

這樣站台重啟後,任務還在

剛剛是展示等待任務進來,若是需要一直輪詢且主動式的讀取任務,該怎麼實現?


在 PeriodicLoggerService 類別中,同樣繼承 BackgroundService 類別,同樣實作 ExecuteAsync() 方法,

只是加入了PeriodicTimer 類別來達到輪詢的機制




站台啟動後每 5 秒就會執行


完整 Program.cs


參考


沒有留言:

張貼留言