Orleans解决并发之痛(三):集群

Orleans本身的设计是一个分布式的框架,多个Silo构成集群,Grains分布在多个Silo中。一旦一个Silo挂了,原来归属这个Silo的Grains会自动在其他Silo中激活。生产环境下还是需要以集群方式来部署。


cluster

在Orleans解决并发之痛(二):Grain状态文章中提到内存存储State是不靠谱的,同样,以内存方式存储集群中Silo的成员关系也是不靠谱的,所以本文使用SQL Server来做Silo的成员关系存储,以内存方式存储成员关系存在主节点之说,其他节点的启动必须依赖主节点的启动状态,但以Azure Table、SQL Server 、ZooKeeper、Consul 等存储成员关系,所有的Silo都是平等的,不需要等待谁。

之前在Orleans解决并发之痛(一):单线程Demo中是以内存存储集群成员关系的,有兴趣可以返回查看。

这篇文章的Demo是Orleans解决并发之痛(二):Grain状态的基础上完成的,所以在原来代码的基础上做一些调整即可。我们会启动3个Silo,构建成一个集群环境。实际上提供3个配置文件即可,配置文件稍做修改就可实现。

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 配置有所区别,其他完全一样。

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节点:
SystemStoreType:存储的类型;如:AzureTable、SqlServer、ZooKeeper等;
DeploymentId:部署的唯一Id标识,具有相同的DeploymentId的Silo会加入一个集群中;
DataConnectionString:连接字符串;

3台Silo启动成功后,在OrleansStorage库的OrleansMembershipTable表中会记录下成员关系:


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标识连接Silo集群。具体最终调用那个Silo完成方法的调用,由其内部调配。当某一台Silo挂了,Grain会重新在另一个Silo上激活,达到高可用状态。

Client的测试代码:

我们用一个死循环,创建很多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();
}

测试结果:

从控制台输出结果来开,每台Silo上Grain的分配还是比较均匀的


Test Result

当杀掉一个Silo后,服务依然是正常运行,具体Grain是否重新被分配有兴趣可以测试一下:



Test Result2

参考链接:

  • Actor模型

  • Orleans

  • 案例Demo-OrleansCluster

关文章: 

  • .NET的Actor模型:Orleans

  • 微软分布式云计算框架Orleans(1):Hello World

  • 微软分布式云计算框架Orleans(2):容灾与集群(1)

  • Aaron Stannard谈Akka.NET 1.1

  • 使用Akka.net开发第一个分布式应用

  • Orleans入门例子

  • Orleans例子再进一步

  • Orleans稍微复杂的例子—互动

  • Orleans简单配置

  • Orleans配置---持久化

  • Orleans—一些概念

  • Orleans的集群构建

  • Oleans集群之Consul再解释

  • Orleans解决并发之痛(一):单线程

  • Orleans解决并发之痛(二):Grain状态

原文地址:http://www.jianshu.com/p/fdf4b3456039


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

avue中实现消息的实时展示

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言一个功能写了大半天&#xff0c;主要是数据表设计的有点复杂&#xff0c;且这个项目是10月份就写的放那的&#xff0c;里面有些东西都忘记了……先看数据库结构&#xff0c;然后理…

org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation

转载自 mybatis 注解引发的bug&#xff0c;org.apache.ibatis.builder.BuilderException: Could not find value method on SQL anno Mybatis用注解开发且还用script标签 这种bug&#xff0c;网上一搜一大堆&#xff0c;但是都xml方式开发&#xff0c;大部分说的是返回类型或…

P2375-[NOI2014]动物园【KMP,字符串】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2375 题目大意 对于kmp操作&#xff0c;我们多求一个numnum数组&#xff0c;表示对于字符串SS的前i" role="presentation">ii个字符构成的子串&#xff0c;既是它的后缀同时又是它…

发达国家与发展中国家编程语言技术的分布差异性

近日&#xff0c;Stack Overflow在官方博客上发布了一组统计数据&#xff0c;表明发达国家与发展中国家在编程语言技术的采用上存在较大的差异。Stack Overflow对2017年1月至8月期间的访问数据进行了分析&#xff0c;选取了64个技术标签&#xff0c;每个标签所包含问题的访问次…

两个map中的数据,按照相同键,将所对应的值相加方法

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言最近写代码的时候遇到了个需求&#xff0c;刚开始想的时候&#xff0c;感觉不难&#xff0c;挺简单的&#xff0c;结果写的时候&#xff0c;各种思考、各种费脑&#xff0c;耗费了点…

mybatis example处理and、or关系的方法

转载自 mybatis example处理and、or关系的方法 1.( xx and xx) or ( xx and xx) 实例代码&#xff1a; BaUserExample baUserExample new BaUserExample();Criteria criteria1 baUserExample.createCriteria(); criteria1.andOrgIdEqualTo("1"); criteria1.an…

P2580-于是他错误的点名开始了【Trie,字符串】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2580 题目大意 给n个字符串&#xff0c;用m个字符串和他们匹配&#xff0c;分为错误匹配,重复匹配,正确匹配。 解题思路 裸的TrieTrie(字典树) code #include<cstdio> #include<cstring&g…

publiccms中将推荐页的内容显示在页面片段中

遍历的代码如下&#xff1a; <#list page.list><ul><#items as a><li><figure><!-- ${a.itemType!} : ${a.itemId!} ,place/redirect:count and 301 jump to a.url,place/click:count and 302 jump to a.url--><a href"${site.dyn…

ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

在 ASP.NET 中&#xff0c;我们知道&#xff0c;它有一个面向切面的请求管道&#xff0c;有19个主要的事件构成&#xff0c;能够让我们进行灵活的扩展。通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监听&#xff0c;并通过 HttpHandler 进入到我们的应用程…

【ajax】readyState=4并且status=200时,还进error方法

转载自 【ajax】readyState4并且status200时&#xff0c;还进error方法 今天在使用jquery.ajax方法去调用后台方法时&#xff0c;ajax中得参数data类型是"JSON",后台DEBUG调试&#xff0c;运行正常&#xff0c;返回正常的结果集,但是前端一直都进到ajax的error方法…

publiccms实现首页菜单栏下拉的方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天接到了个需求&#xff0c;使用publiccms实现首页导航栏下拉的效果&#xff0c;效果如下&#xff1a; 目前我的思路如下&#xff1a; 采用分类的方法实现将左侧的项作为二级分类右边…

P2922-[USACO08DEC]秘密消息Secret Message【Trie,字符串】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2922 题目大意 给n个01串&#xff0c;用m个01串匹配&#xff0c;如果n是m的前缀或者m是n的前缀那么就算匹配成功&#xff0c;求每个串有多少个匹配成功。 解题思路 我们可以用Trie树&#xff0c;分为…

2017(深圳) .NET技术分享交流会(第二期)网络直播活动

.NET Core 2.0 已于2017年8月14日正式发布&#xff0c;2017(深圳) .NET技术分享交流会在公众号中发出2个小时后就被抢光了&#xff0c;受限于场地无法增加人数&#xff0c;这次如鹏网杨中科老师提供VIP级的网络直播支持&#xff0c;为了保证网络直播效果&#xff0c;另外开启网…

publiccms中,怎么修改默认的端口8080以及默认上下文名称

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 我用的部署方式是springboot的方式,所以修改端口和项目名的方法和tomcat的方法不一样&#xff0c;tomcat的话去改一下conf目录下面的serve.xml文件。 springboot的方式不需要&#xff0c…

JQuery AJAX请求结果的null为key时无法进入success方法

一、问题复现 后台&#xff1a; import java.util.*; Controller public class Test{RequestMapping("/get/loadInfo.do")ResponseBodypublic Result getLoadInfo(){Result resnew Result();Map map new HashMap();map.put(null,"one");map.put("a&…

洛谷UVA1328,POJ1961-Period【KMP,字符串】

正题 洛谷评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidUVA1328 POJ链接:http://poj.org/problem?id1961 题目大意 求一个字符串每个前缀的最短循环循环次数。 解题思路 计算next数组&#xff0c;然后直接计算循环节&#xff1a; 详见:POJ2752-Seek…

publiccms实现多层级选项卡效果

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 距离上次更新已经好久了~最近心有余而力不足。。 最近在学习freammarker标签&#xff0c;算是比较老的技术了&#xff0c;白天写&#xff0c;晚上做梦都在写&#xff0c;不吐槽了&am…

Java对象的引用类型

转载自 Java对象的引用类型 Java对象的引用类型有强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;虚引用和FinalReference,提供这几种引用类型的主要目的&#xff1a; 1.程序员可以通过不同的引用方式决定某些对象的生命周期&#xff1b; 2.利用JVM的垃圾回收机制&a…

“雪花”项目:Microsoft探索在.NET中实现手工内存管理

来自Microsoft研究院、剑桥大学和普林斯顿大学的一些研究人员构建了一个.NET的分支&#xff0c;实现了在运行时中添加支持手工内存管理的API。研究方法的细节及所获得的性能提升发表在名为“Project Snowflake: Non-blocking Safe Manual Memory Management in .NET”&#xff…

loj#10050-The XOR Largest Pair【Trie(字典树)】

正题 题目链接:https://loj.ac/problem/10050 题目大意 有n个数&#xff0c;求两个数使他们异或起来最大。 解题思路 我们考虑构建一个TrieTrie。 两个分叉为0,1&#xff0c;对于每个数二进制下不够30位我们将其补够30位&#xff0c;然后再根据二进制01构建TrieTrie。 然后…