[英]How to run Microsoft Orleans Silo and Client in the same AppDomain
我要做的就是: 在同一個AppDomain中運行Silo和Client
使用奧爾良的教程,一切都會順利進行:
static void Main(string[] args)
{
AppDomain hostDomain = AppDomain.CreateDomain("OrleansHost", null,
new AppDomainSetup()
{
AppDomainInitializer = InitSilo
});
DoSomeClientWork();
hostDomain.DoCallBack(ShutdownSilo);
}
static void InitSilo(string[] args)
{
siloHost = new SiloHost(System.Net.Dns.GetHostName())
{
ConfigFileName = "SiloConfiguration.xml"
};
siloHost.InitializeOrleansSilo();
var startedok = siloHost.StartOrleansSilo(); //Works perfectly
if (!startedok)
throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", siloHost.Name, siloHost.Type));
}
static void DoSomeClientWork()
{
var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(30000);
GrainClient.Initialize(config);
var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
var result = friend.SayHello("Goodbye").Result;
Console.WriteLine(result);
}
當我想使用相同的AppDomain時出現問題:
static void Main(string[] args)
{
//Same AppDomain
Task.Run(() => InitSilo());
DoSomeClientWork(); //This is changed to await/retry until the Silo is Up
ShutdownSilo();
}
為什么要嘗試遵循此路徑:這樣做的目的是防止客戶端外出並通過網絡再次進入,因為它們在同一台計算機上運行。 由於網絡活動,這產生了開銷。 因此,我試圖避免這種開銷。
當然,如果本地孤島發生故障,客戶端必須通過網絡出去才能找到可用的孤島。
使事情變得過於復雜的事實是,我看不到任何有用的錯誤,只是錯誤和一些未找到的lib參考錯誤。
原始代碼經過簡化,只是為了避免弄臟它,但是,如果您感覺需要了解我到目前為止所做的一切,請告訴我。 任何幫助,推薦或建議都是有用的。
如果您升級到Orleans 1.5.0,則應該能夠實現,因為已刪除了許多靜態變量。 您還應該直接使用ClientBuilder和IClusterClient而不是靜態GrainClient來使其正常工作。 實際上,一旦升級到1.5.0,VS中的默認模板就不再為客戶端/ silo主機使用單獨的AppDomain。
話雖如此,目前尚無內置支持,即使在同一個AppDomain下也可以完全跳過網絡代碼,但是我們正處於計划階段以開始支持它。 當前的想法是您仍然使用IClusterClient抽象,但是在幕后我們將通過不進行任何額外的聯網來做一些更聰明的事情。 因此,即使尚未進行優化,這也是最安全的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.