Orleans简单配置

  话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"…用ini或者json多简单易懂,现在发觉作为配置文件,json有赶超xml的趋势.不过xml用多了,也觉得顺眼多了.不觉得<>难看了,反而它能折叠让我觉得组织起来也更方便了.这说明一个道理:不是你上了大学,而是大学上了你.你觉得痛苦到方便的过程,就是这种转变的佐证.所以C++又名C艹.你们细细体会一下.

    Orleans完全体,分为Orleans客户端以及Orleans服务端,所以配置也应对与这两方面.再Orleans源码里也可以看出来,如下截图:

    

    其中cluster就是服务端配置,client就是客户端配置.说一说cluster,起个名字就叫cluster说明再实际应用中,单个siloHost不能满足Orleans小组的需求,可以听到Orleans君呐喊说:我天生就是为cluster的.瞬间觉得我举得栗子,单silo的例子是个low X.不过没事..微软还举了个例子,甚至把四个项目(client,host,接口,以及Grain实现)都放在了一个项目中.有空可以去看看.

    确实,如果不是为了分布式,Orleans带来的好处就少了许多,单silo带来的好处就是,编写多线程程序的时候,逻辑变清晰了,出错少了.可以这么说,多线程要是没有锁,难度就减少了一大半了.但是分布式,分布式,分布式…就算是不需要锁,分布式一样很难.Orleans的出现让分布式的难度又降低了一大半.

    基于编程的配置,在介绍完基于文件的配置之后,各位观众可以自己研究.vs中需要引入OrleansConfiguration.xsd文件才能更好的利用智能提示来配置.这个文件在Orleans源码中有.

客户端配置

    客户端的配置非常简单,假设此文件名字叫做client.xml

<ClientConfiguration xmlns="urn:orleans"><Gateway Address="192.168.1.1" Port="30000"/><Gateway Address="192.168.1.2" Port="30000"/><Gateway Address="192.168.1.3" Port="30000"/></ClientConfiguration>

 

使用它也很简单:如下图

这些Gateway显然对应着silo提供的端口和网址,通常来说这些关口配置一个就可以了.不过配置多个可以帮助提高稳定性(前提是silo存在).在1.5版本以及之后,Orleans提供了一个非静态的GrainClient类,名字是ClientBuilder.一个客户端可以有多个Client了..每个client可以有不同的 配置文件.选择一下子又多了起来.

以上的配置是基于silo的地址端口固定的情况,但是Orleans支持服务发现,特别是在基于集群的配置的时候.client甚至不知道silo的地址在哪,它只需要查询"服务发现"的服务.这个服务返回现在活着的silo的地址.client连接这些地址.基于集群的客户端配置是如下格式:

<ClientConfiguration xmlns="urn:orleans"><SystemStore SystemStoreType="SqlServer"DeploymentId="target deployment ID"DataConnectionString="SQL connection string"/></ClientConfiguration>

 

这样可以使用sql server作为服务发现的服务.并不是随便的sql server都可以作为服务发现用的.在源代码中官方提供了一些sql脚本.通过这个sql脚本构建好数据库,就可以用来服务发现了.

用数据库作为服务发现是很好的选择,不过我没有采用它,我是基于以下考虑的:数据库还要作为数据持久化设备,还要作为event sourcing.还要钱…我采用了更为轻量化的方案.这个不是本文的重点.关于集群的配置方法我会在以后的文章中举个栗子.现在文章的目的是为了引入持久化.所以就暂时按住不表.且待我接着说存储的配置.好了客户端的基本配置就结束了.(构建集群的配置会再后边文章详细说说,这里先稍微引入一下)

说说重头戏,服务端配置,就像上边截图中列示的一样,服务端配置就是cluster的配置!!!哈哈,怕了吗?

为了测试和开发,可以如下配置本地的silo

<OrleansConfiguration xmlns="urn:orleans"><Globals><SeedNode Address="localhost" Port="11111" /></Globals><Defaults><Networking Address="localhost" Port="11111" /><ProxyingGateway Address="localhost" Port="30000" /></Defaults></OrleansConfiguration>

 

Orleans简单配置---服务端

这个世界有太多太多的选择了,大部分时候选择太多才是我苦恼的主要原因,为了某个组织方式,要和自己讨论,好不容易说服自己,又要和其他人讨论,到最后一般被否决(黑脸).不管怎么说,选择困难是人类的通病,没得选,大部分时候反而更能提高效率.所以说,这让我们明白一个道理:少读点书,让自己没得选,生活会更幸福. 当你看到不明白的地方,皱着眉头思索着,仿佛自己都能听到自己脑袋咔咔作响,感觉这就是你脑结构改变的过程.其实这是错觉,本质上还是因为犯愁.选择困难症又犯了,大脑不知道该唤醒那块区域…

以上这一段更本文有很大关系.

服务端配置主要是有两个方面,由于silo要与其他silo之间进行联系,组成一个集群,而且它还需要和client通信,所以它需要配置两个端口.一个用于silo间的通信,一个用于与client的通信.服务端需要配置关于集群的各个信息和关于自己节点的各个信息.所以总体来说服务端配置长成这样子

分两个节:Globals节和Defaults节.Globals里面都是关于集群的配置,而Defaults里面都是关于自己节点的配置.

既然说到集群,就不得不夸夸Orleans了.Orleans的集群在客户端看来,就仿佛是一个silo.而且对于silo内部运行的Grain类实例看来,也仿佛是一个silo.这样做的好处就是,你开发的时候使用单例silo进行开发,然后通过配置服务发现,配置持久化,以及把silo多复制几份,就可以做到分布式了.背后太多的工作都是Orleans完成的.同时Orleans还提供了检测机制,用于探测集群内部崩溃,掉线等原因而无法链接到的silo,以及新加入的silo等等.这些集群节点的变动对于Grain实例以及客户端来说,大部分情况都无需关心(仍需要关心小部分情况,比如所有节点都崩溃等等).

分布式程序中,一致性是一个重要的问题,Orleans集群内部维持一个MembershipTable(成员关系表),所有的集群节点都需要维持自己的成员关系表.所以在silo启动的时候会有如下记录:

这个表在集群的行为上发挥着重要的作用,这个按下不表,说一说山东好汉塞喽(silo).

要知道塞喽在Orleans中是一个实体类,但是集群不是,赛喽不知道集群的存在,它只知道按照配置文件与其他silo互动,这些所有的互动行为的结果,让人感觉它们合体了,是一个整体,这个整体有一个新的名字是梁山聚义堂.所以严格意义上来说,集群内部的silo中的Globals节点的配置可以不同.因为它就是告诉silo如何和其他silo进行互动的.但是我想没有人这么干(配置文件不相同).这是给自己添堵.

一个简单的服务端配置,如下图

可以看出来,这个节点本质上就是集群的主节点.membershipTable需要找一个地方存储,默认的是内存保存这个成员关系表,怎么看出来的?如下图

其中的GrainBasedMembershipTable就是Orleans用一个内置的Grain类管理了成员关系表.

之前说过成员关系表最终是要在各个silo之间统一的.所以在一个集群中如果有主silo,那么所有非主silo的成员关系表,就需要和主silo的统一.在从silo的日志中可以看到这样的记录

经过以上配置,一个简单的silo集群主silo就形成了.

现在我把从silo的配置文件也一起贴出来,大家看看变化,

虽然这个集群是可以工作的,但是不符合稳定性,而且灵活性也不够.因为如果主silo挂了,整个集群就挂了.在集群配置的时候,主要考虑以哪里的成员关系表为标准在集群内进行统一.正如前面说的,可以用数据库存储成员关系表.这样的配置文件就需要有所变化.至于如何变化,会再后续的文章中详细说明,比较集群的配置是Orleans的一项重要内容.所以在此暂且按下不表,说一说,引入配置的原因,那就是介绍如何持久化grain数据.

相关文章: 

  • .NET的Actor模型:Orleans

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

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

  • Aaron Stannard谈Akka.NET 1.1

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

  • Orleans入门例子

  • Orleans例子再进一步

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

原文地址:http://www.cnblogs.com/gaopang/p/7402420.html


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

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

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

相关文章

say小组KTV点歌系统简介

指导老师&#xff1a;穆老师 班主任&#xff1a;佟老师小组成员&#xff1a;组长&#xff1a;焦文宇 组员&#xff1a;窦倩 王晓凤 巩固 石虹蔓 田锋目录&#xff1a;1.首页 2.项目前台 3..项目后台总结&#xff1a;从5月25号开始的到6月10号结束&#xff0c;这期间我们遇…

Java虚拟机必学之四大知识要点,附学习资料

转载自 Java虚拟机必学之四大知识要点&#xff0c;附学习资料 作为一位 Java 程序员&#xff0c;在尽情享受 Java 虚拟机带来好处的同时&#xff0c;我们还应该去了解和思考“这些技术特性是如何实现的”&#xff0c;去了解最底层的原理。只有熟悉 JVM&#xff0c;你才能在遇…

程序配置amp;amp;ConfigurationManager

配置组件是.net framework中非常常用的功能。在创建.net framework 工程时&#xff0c;系统不仅会自动生成app.config文件&#xff0c;而且还提供了非常强大的访问类库。但是这些好东西&#xff0c;在.net core 2.0中已经不复存在&#xff0c;至少说没有.net framework 中那么完…

既然参与,那就做好,我相信我们是最棒的!!!

‍‍大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天是3班的KTV项目答辩&#xff0c;也是20级的最后一个班级&#xff0c;连续6天的KTV项目答辩终于告一段落。回顾各班所做的项目&#xff0c;通过我自己参与点评的以及从班内参观同学…

又发生频繁FGC,这次是谁的锅

转载自 又发生频繁FGC&#xff0c;这次是谁的锅 这是笨神JVMPocket群里一位名为"云何*住"的同学提出来的问题&#xff0c;问题现象是CPU飙高并且频繁FullGC。 重现问题 这位同学的业务代码比较复杂&#xff0c;为了简化业务场景&#xff0c;笔者将其代码压缩成如…

三个剩两个,两个剩一个,最后一个都没剩下。

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天文章的标题本来是&#xff1a;“从未见过如此不要脸耍无赖的人&#xff01;&#xff01;&#xff01;”&#xff0c;后来想了想&#xff0c;毕竟公众号里面还有那么多不同身份的粉丝&a…

算法面试,如何在100 亿URL中判断某个URL是否存在

转载自 算法面试&#xff0c;如何在100 亿URL中判断某个URL是否存在 如果面试官问你&#xff0c;一个网站有 100 亿 url 存在一个黑名单中&#xff0c;每条 url 平均 64 字节。问这个黑名单要怎么存&#xff1f;若此时随便输入一个 url&#xff0c;如何判断该 url 是否在这个…

.NET Core 2.0迁移技巧之web.config配置文件

大家都知道.NET Core现在不再支持原来的web.config配置文件了&#xff0c;取而代之的是json或xml配置文件。官方推荐的项目配置方式是使用appsettings.json配置文件&#xff0c;这对现有一些重度使用web.cofig配置的项目迁移可能是不可接受的。 但是好消息是&#xff0c;我们是…

学会它,可以替你写100行 200行 300行……的代码

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天&#xff0c;给大家分享一个非常非常使用的小技巧&#xff0c;那就是&#xff1a;“在webstrom中创建一个简单的vue模板”&#xff0c;根据这个方法&#xff0c;你可以任意的创建html模…

Java中随机数的原理,以及使用时的注意点

转载自 Java中随机数的原理&#xff0c;以及使用时的注意点 1 前言 一提到 Java 中的随机数&#xff0c;很多人就会想到 Random&#xff0c;当出现生成随机数这样需求时&#xff0c;大多数人都会选择使用 Random 来生成随机数。Random 类是线程安全的&#xff0c;但其内部使…

MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

dotnet core 2.0 发布已经好几天了&#xff0c;期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0&#xff0c;升级过程还是比较顺利的&#xff0c;变动也不是太多。升级的过程中也少不了 Entity Framwork Core 的升级&#xff0c;在这篇文章中主要介绍下 MySql 数据库使用…

下午带着几个同学打了两节课的牌~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。大赛的项目目前正在火热进行中&#xff0c;靳天宇小组做的是扑克牌的游戏&#xff0c;除了要做大家耳熟能详的“斗地主”之外&#xff0c;另外在我的建议下准备再加两种玩法&#xff0c;一…

jzoj2137-(GDKOI2004)城市统计【二维前缀和,bfs】

正题 大意 有n*n的矩阵&#xff0c;有居民区有商业区&#xff0c;每个居民区曼哈顿距离最近的商业区的曼哈顿距离就是那个居民区离商业区的距离。每个格子统计一下以它为中心的2∗r12∗r12∗r12∗r1的矩阵内所有居民区离商业区的距离的和。 解题思路 先bfs计算所有居民离商业…

Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍

Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了&#xff0c;一下子Net圈热闹了起来&#xff0c;2.0带来了很多新的特性和新的功能&#xff0c;其中Razor Page引起我的关注&#xff0c;作为web程序员来说&#xff0c;Asp.Net下的任何web框架都会去特别关注&…

二叉 树

文章目录递归方式 先序、中序、后序 遍历非递归方式 先序、中序、后序 遍历实现二叉树的按层遍历求二叉树的最大宽度二叉树的序列化和反序列化二叉树有 left、right、parent &#xff0c;给这样二叉树的某个结点&#xff0c;返回该节点的后继节点折纸条递归方式 先序、中序、后…

“老师,弃了吧,做个别的……”“笑话,都到这个份上了,怎么能弃掉呢?”...

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。最近项目小组一直在按照原计划做项目&#xff0c;聊天程序&#xff08;高仿版微信&#xff09;已经趋于尾声&#xff0c;做的还可以&#xff0c;剩下的就是美化和慢慢的完善小问题了&#…

IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除

转载自 IntelliJ IDEA 源值1.5已过时&#xff0c;将在未来所有版本中删除 原因&#xff1a; IDEA默认把项目的源代码版本设置为jdk1.5&#xff0c;目标代码设置为jdk1.5 解决方案&#xff1a; 1修改Maven的Settings.xml文件添加如下内容 <profile><id>jdk-1.8&…

.NET Core 2.0迁移技巧之MemoryCache问题修复

对于传统的.NET Framework项目而言&#xff0c;System.Runtime.Caching命名空间是常用的工具了&#xff0c;其中MemoryCache类则常被用于实现内存缓存。 .NET Core 2.0暂时还不支持System.Runtime.Caching dll&#xff0c;这也就意味着MemoryCache相关代码不再起作用了。 但是…

今天干了两件大事!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天干了两件大事。第一件就是为明天的“IT技能大赛”做了充足准备&#xff0c;带着6个班级的7个小组&#xff0c;在报告厅过了一遍&#xff0c;然后安排了两个后台控制同学&#xff0c;主…

JAVA后端面试100 QA之第一篇

转载自 JAVA后端面试100 Q&A之第一篇 1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义都是可重入锁 不同点 实现机制不同 synchronized通过java对象头锁标记和Monitor对象实现 reentrantlock通过CAS、ASQ&#xff08;AbstractQueuedSy…