簡體   English   中英

防止並行執行擴展的 ASP.NET Core 托管服務

[英]Prevent parallel executions of scaled ASP.NET Core hosted service

我在 AWS (AWS fargate) 上托管了 web api。 我想發送一些電子郵件和其他東西作為后台服務 問題是,如果我決定我的 web api 來擴展將執行該托管服務的多個實例。

我有 sql 數據庫和一些存在“IsEmailSent”和“IsReportSent”標志的表。

后台托管服務只是遍歷所有字段為假的行,因此該服務的實現可能相對容易。

然而,當談到“防止”多個實例運行托管服務時,有幾個選項。 在這種設置中最簡單的方法是什么? 這是我首先想到的:

引入某種可能很危險且性能不佳的數據庫鎖定。

使用 AWS SQS 並在后台服務中出列是一種選擇,但如果不需要,我想避免它,因為我目前不在應用程序的任何地方使用 SQS。

要管理多個實例而不是獲得相同的項目,您需要一個“推送”系統。 實現它的最佳方式是通過隊列。

如果您不想使用隊列,另一種方法是控制實例,並僅在一個實例中“啟動”worker。 您可以使用簡單的數據庫來選擇可用於處理項目的實例。

但我再說一遍,最好的方法是通過 Queue 或 Hooks

我有幾個想法如何解決這個問題。

第一個,嘗試使主服務成為您的多尺度服務之一。 它是唯一可以處理命令的服務,您可以在其中啟動后台服務以進行電子郵件發送。 其他服務將只處理查詢(GET 方法)。 為此,您可以使用配置文件。 並以不同的配置運行主從。 您可以找到另一種更適合您的基礎架構的方式。 目標是只運行一個后台服務。 這不喜歡這種方式。

第二個需要引入額外的服務。 它也可以是運行后台服務的 .NET 應用程序,但除了讀取數據庫和發送電子郵件之外,它必須什么都不做。 您將此應用程序作為一個實例運行。 它不必被縮放。 您也可以使用 WebHook 將此服務與數據庫分離。 它允許您訂閱某些事件並發送電子郵件,而無需訪問其他服務的數據庫。 如果您想擴展電子郵件發件人服務,可以通過負載平衡器解決它,或者您應該查看事件總線(如果您已經在堆棧中使用它,這是一個不錯的選擇)。 這個我比第一個更喜歡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM