Asp.net

AKKA.NET演員系統在ASP.NET中

  • March 22, 2022

我在ASP.NET中創建了一個RESTful API的服務,託管在IIS中。在此服務中,我想創建一個帶有akka.net的演員系統。

創建演員系統時:

var actorSystem = ActorSystem.Create("myActorSystem");

拋出以下異常:

System.Web.dll在System.Web.DLL中發生的第一個機會異常.Web.dll附加資訊:此時無法啟動非同步操作。非同步操作只能在非同步處理程序或模組或頁面生命週期中的某些事件中啟動。如果在執行頁面時發生此異常,請確保頁面標記為<%@ Page Async =“true”%>。此異常還可以指示嘗試呼叫“非同步void”方法,該方法通常不受ASP.NET請求處理。相反,非同步方法應該返回任務,並且呼叫者應該等待它。

Actor系統固有地是一個並發系統,其中在演員之間交換非同步消息。如在此說明那樣,這個演員系統不會在IIS上脫下AppDomain,這可能是為什麼拋出上述異常。

本文介紹瞭如何在ASP.NET中執行背景任務。但是,我沒有看到我如何為我的演員系統使用它,因為我無法控制可能由akka.net創建的背景任務的生命週期。

有沒有辦法製作這項工作,或者我應該放棄在ASP.NET應用程序中擁有演員系統的想法嗎?

編輯:我還看到了關於使用AKKA實現REST服務的StackOverflow的問題。有關類似於Spray Toolkit的解決方案的任何建議,但歡迎為Akka.net工作。

將ActorSystem保留為某些靜態類容器中的共享屬性 - 以這種方式,您可以從您的其餘部分訪問它。演員系統初始化/處置可以通過:

  • global.asax -ActorSystem.Create(...)在Global.asax中使用Application_Start並將其丟棄system.Shutdown()Application_End
  • OWIN - 以OWIN的方法創建演員系統,並通過綁定到Host.OnAppDispuping事件(How-to LinkStartup.Configuration來關閉它。

請記住,IIS將僅在首次請求之後啟動您的Web應用程序並在空閒時自動撕下它。因此,確保您的部署腳本將在發布後ping應用程序,並且如果希望您的Akka Actor系統連續執行,則足夠長時間的空閒超時(連結)。

第二種選擇

將Actor系統邏輯分開並將其部署為例如Windows服務(或Linux Deamon)。打開akka.remoting for it並創建一個代理客戶端,這將使所有應用程序長期執行的敏感任務轉發到外部服務。當您的應用程序邏輯必須連續工作時,通常使用類似的解決方案諸如調度員或事件匯流排。

我已經使用AKKA.NET和AKKA.Remote內部在EC2上的ASP.NET MVC應用程序中,在EC2上執行高達1000個請求 - 所以我會分享我曾經成功啟動並執行的一些提示和技巧。有一個原型版本,甚至使用了akka.cluster但最終沒有運送那種版本。

  • 最佳撥打地點ActorSystem.Create是global.asax Application_Start()
  • ActorSystem使用靜態欄位或屬性懸掛在Global.asax本身內的對象的靜態引用。有助於確保ActorSystem本身不會在長期執行的應用程序中收集垃圾。
  • 創建一個單獨的靜態輔助類,以初始化任何頂級Actors您的應用程序需求 - 即在/user/層次結構頂部的Actors。此類還應提供您的ASP.MVC控制器和操作方法可以使用的Actor路徑TellAsk操作。

創建ActorSystem是一點昂貴的操作,因為大量的系統級內容立即被擊中。它絕對最好在應用程序啟動時完成一次,然後只需記憶體Application類內的結果。

創建單個演員實例很便宜 - 您應該能夠在ASP.NET MVC操作方法中執行此無問題。如果您看到此錯誤再次出現,請讓我們知道請求處理過程中的哪一部分此錯誤發生,並使用哪個版本的ASP.NET。

編輯:添加了一些在ASP.NET核心上執行此操作的更新指南

https://petabridge.com/blog/akkadotnet-aspnetcore/

引用自:https://stackoverflow.com/questions/27634843