Orleans解决并发之痛(三):集群
Orleans本身的設(shè)計(jì)是一個分布式的框架,多個Silo構(gòu)成集群,Grains分布在多個Silo中。一旦一個Silo掛了,原來歸屬這個Silo的Grains會自動在其他Silo中激活。生產(chǎn)環(huán)境下還是需要以集群方式來部署。
cluster
在Orleans解決并發(fā)之痛(二):Grain狀態(tài)文章中提到內(nèi)存存儲State是不靠譜的,同樣,以內(nèi)存方式存儲集群中Silo的成員關(guān)系也是不靠譜的,所以本文使用SQL Server來做Silo的成員關(guān)系存儲,以內(nèi)存方式存儲成員關(guān)系存在主節(jié)點(diǎn)之說,其他節(jié)點(diǎn)的啟動必須依賴主節(jié)點(diǎn)的啟動狀態(tài),但以Azure Table、SQL Server 、ZooKeeper、Consul 等存儲成員關(guān)系,所有的Silo都是平等的,不需要等待誰。
之前在Orleans解決并發(fā)之痛(一):單線程Demo中是以內(nèi)存存儲集群成員關(guān)系的,有興趣可以返回查看。
這篇文章的Demo是Orleans解決并發(fā)之痛(二):Grain狀態(tài)的基礎(chǔ)上完成的,所以在原來代碼的基礎(chǔ)上做一些調(diào)整即可。我們會啟動3個Silo,構(gòu)建成一個集群環(huán)境。實(shí)際上提供3個配置文件即可,配置文件稍做修改就可實(shí)現(xiàn)。
Silo配置文件
OrleansConfiguration1.xml:
<?xml version="1.0" encoding="utf-8" ?> <OrleansConfiguration xmlns="urn:orleans"><Globals><SystemStore SystemStoreType="SqlServer" DeploymentId="OrleansTest" DataConnectionString="Server=.;Database=OrleansStorage;User ID=sa;Password=123456;"/><StorageProviders><Provider Type="Orleans.Storage.AdoNetStorageProvider"Name="OrleansStorage"AdoInvariant="System.Data.SqlClient"DataConnectionString="Server=.;Database=OrleansStorage;User ID=sa;Password=123456;"/></StorageProviders></Globals><Defaults><Networking Address="localhost" Port="11111" /><ProxyingGateway Address="localhost" Port="30000" /></Defaults> </OrleansConfiguration>OrleansConfiguration2.xml和OrleansConfiguration3.xml除了Networking 、ProxyingGateway 配置有所區(qū)別,其他完全一樣。
OrleansConfiguration2.xml:
<Networking Address="localhost" Port="11112" /> <ProxyingGateway Address="localhost" Port="30001" />OrleansConfiguration3.xml:
<Networking Address="localhost" Port="11113" /> <ProxyingGateway Address="localhost" Port="30002" />這次配置文件中引入了一個SystemStore節(jié)點(diǎn):
SystemStoreType:存儲的類型;如:AzureTable、SqlServer、ZooKeeper等;
DeploymentId:部署的唯一Id標(biāo)識,具有相同的DeploymentId的Silo會加入一個集群中;
DataConnectionString:連接字符串;
3臺Silo啟動成功后,在OrleansStorage庫的OrleansMembershipTable表中會記錄下成員關(guān)系:
systemStore
Client配置文件
ClientConfiguration.xml:
<?xml version="1.0" encoding="utf-8" ?> <ClientConfiguration xmlns="urn:orleans"><SystemStore SystemStoreType ="SqlServer"DeploymentId="OrleansTest"DataConnectionString="Data Source=.;Database=OrleansStorage;User ID=sa;Password=123456;" AdoInvariant="System.Data.SqlClient" /> </ClientConfiguration>Client通過DeploymentId標(biāo)識連接Silo集群。具體最終調(diào)用那個Silo完成方法的調(diào)用,由其內(nèi)部調(diào)配。當(dāng)某一臺Silo掛了,Grain會重新在另一個Silo上激活,達(dá)到高可用狀態(tài)。
Client的測試代碼:
我們用一個死循環(huán),創(chuàng)建很多Grain,來觀察Silo控制臺的輸出效果
var random = new Random(); while (true) {Thread.Sleep(1000);var grainId = random.Next().ToString();var grain = GrainClient.GrainFactory.GetGrain<IPersonGrain>("Test-" + grainId);grain.SayHelloAsync(); }測試結(jié)果:
從控制臺輸出結(jié)果來開,每臺Silo上Grain的分配還是比較均勻的
Test Result
當(dāng)殺掉一個Silo后,服務(wù)依然是正常運(yùn)行,具體Grain是否重新被分配有興趣可以測試一下:
Test Result2
參考鏈接:
Actor模型
Orleans
案例Demo-OrleansCluster
關(guān)文章:?
.NET的Actor模型:Orleans
微軟分布式云計(jì)算框架Orleans(1):Hello World
微軟分布式云計(jì)算框架Orleans(2):容災(zāi)與集群(1)
Aaron Stannard談Akka.NET 1.1
使用Akka.net開發(fā)第一個分布式應(yīng)用
Orleans入門例子
Orleans例子再進(jìn)一步
Orleans稍微復(fù)雜的例子—互動
Orleans簡單配置
Orleans配置---持久化
Orleans—一些概念
Orleans的集群構(gòu)建
Oleans集群之Consul再解釋
Orleans解決并發(fā)之痛(一):單線程
Orleans解決并發(fā)之痛(二):Grain狀態(tài)
原文地址:http://www.jianshu.com/p/fdf4b3456039
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Orleans解决并发之痛(三):集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深圳】掌通宝科技有限公司技术总监(兼架
- 下一篇: 发达国家与发展中国家编程语言技术的分布差