orleans

Difference between method call in normal C# and Orleans

和自甴很熟 提交于 2019-12-01 00:44:19
I am running Orleans in localHost Clustering mode and currently have 1 grain and a client. // client code for (int i = 0; i <num_scan; ++i) { Console.WriteLine("client " + i); // the below call should have returned when first await is hit in foo() // but it doesn't work like that grain.foo(i); } // grain code async Task foo(int i) { Console.WriteLine("grain "+i); await Task.Delay(2000); } The output of this was as below: client 0 client 1 client 2 client 3 client 4 client 5 client 6 grain 0 client 7 client 8 client 9 client 10 grain 8 grain 7 . . In normal C# , the async function returns only

Difference between method call in normal C# and Orleans

隐身守侯 提交于 2019-11-30 19:41:19
问题 I am running Orleans in localHost Clustering mode and currently have 1 grain and a client. // client code for (int i = 0; i <num_scan; ++i) { Console.WriteLine("client " + i); // the below call should have returned when first await is hit in foo() // but it doesn't work like that grain.foo(i); } // grain code async Task foo(int i) { Console.WriteLine("grain "+i); await Task.Delay(2000); } The output of this was as below: client 0 client 1 client 2 client 3 client 4 client 5 client 6 grain 0

高性能最终一致性框架Ray之基本概念原理

不羁岁月 提交于 2019-11-30 07:37:19
一、Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案。 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且让编码变得复杂和容易出错。 共享内存受限于单节点的服务器资源限制。 Actor模型的优点: 线程之间以消息进行通信,消息按顺序单线程处理,不存在状态竞争。 以消息方式通信,可以方便的组建集群。 把State和Behavior绑定,能更好的控制状态。 名词解释: Mailbox:可以理解为先入先出队列,负责接收和缓存送达的消息。 State:状态信息,比如用户的账户余额信息。 Behavior:负责按顺序处理Mailbox中的消息,比如扣款消息、到账消息,查询余额消息等。 二、Orleans介绍 Orleans是.Net基金会维护的一个Actor跨平台开源框架,独创Virtual Actor概念,支持分布式集群。 项目地址: http://dotnet.github.io/orleans/ 有以下优点: 以对象方式访问Actor,符合面向对象的使用习惯。 提出Virtual Actor概念,可以通过ID访问细粒度的Actor,能承载数千万的Actor对象。 支持Stateful,能替代缓存层来对内存状态进行更精确的控制,减少数据库的压力。 高性能,单个Actor能支持10万+的QPS。 激活透明,Actor对访问者是永久存在的

Translating async-await C# code to F# with respect to the scheduler

陌路散爱 提交于 2019-11-30 06:44:22
I wonder if this is too a broad question, but recently I made myself to come across a piece of code I'd like to be certain on how to translate from C# into proper F#. The journey starts from here (1) (the original problem with TPL-F# interaction), and continues here (2) (some example code I'm contemplating to translate into F#). The example code is too long to reproduce here, but the interesting functions are ActivateAsync , RefreshHubs and AddHub . Particularly the interesting points are AddHub has a signature of private async Task AddHub(string address) . RefreshHubs calls AddHub in a loop

silo 主机 配置

主宰稳场 提交于 2019-11-28 07:00:29
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Orleans; using Orleans.Configuration; using Orleans.Hosting; using System; using System.Net; using System.Threading.Tasks; using w23082019.Default; namespace w23082019.Silo { class Program { static async Task<int> Main(string[] args) { try { var host = new HostBuilder() .UseOrleans((siloBuilder) => { siloBuilder .UseLocalhostClustering() .Configure<ClusterOptions>(options => { options.ClusterId = "dev"; options.ServiceId = "HelloWorldApp"; }) .Configure<EndpointOptions>(options => options.AdvertisedIPAddress =

Orleans入门例子

孤者浪人 提交于 2019-11-27 12:39:04
Orleans入门例子   这是Orleans系列文章中的一篇. 首篇文章在此 一.铺垫。   虽然是个入门例子,还是需要一些铺垫。 Orleans的最小完全体,应该分为2个部分。一个是Orleans客户端,一个是Orleans服务端,这里为什么要加上“Orleans”这个限定词语呢?那是因为Orleans的完全体,才是普通意义上的服务端主程。它们共同构成了游戏服务器,网站服务器等等。 在Orleans客户端中,我们使用GrainClient类以及Grain类,在Orleans服务端内,我们主要使用silo类和grain类。这里要说说Silo类,前面说过Grain类是处于“单线程机制”约束下的类,那么它们运行在哪个地方呢?就是Silo类所在的地方。Silo类是Grain地代码实际执行的地方,它是Grain类的宿主,它承载着所有的Grain实例,也许是几百万个Grain实例。在一些语境下,silo,silohost,以及Orleans服务端,这三个词语有可能代表同一个意思. 一个外部请求的处理大部分情况下需要很多个Grain实例,进行一连串的方法调用后才能处理完毕,这些Grain实例形成一个处理消息的链条,这个消息流走于Grain链内直至处理完毕。那么这个消息是如何第一次到达Grain链条里呢?GrainClient类的作用就是入口,它通知Silo类,有新消息达到

Orleans简介

风流意气都作罢 提交于 2019-11-27 12:38:08
Orleans简介.   Orleans是微软开源的分布式actor模型框架.actor模型的原理网络上有很多文章.有许多理论性的文章,深刻地我都不知道怎么应用.在这里我就不赘述了.既然是博客,就说说自己的理解。 对于编程来说,不管是前台还是后台,在现在的计算机环境下,多线程编程是不可避免的。多线程带来的很多好处,也带来的很多编程上的“坏处”。好处就是,什么并发、高效,高资源利用率等等高大上的词语。这些就不详细说了。就说说坏处. 多线程带来的最大的变化就是:我先前保存的变量A,在我想要再次利用它的时候,A是否被其他线程给更改了?数据库中叫脏读,我们拿过来用,“避免脏读”又有个同义词叫做“操作的原子性”。为了解决脏读的问题,有一下几种办法:   办法一变量A在初始赋值的时候,就规定它不可以被更改,就是不可变,英文叫做immutable,很多函数式语言如F#,scala等都有不可变量。既然量是不可变的。就不会有什么脏读问题了。这真是个好办法,但是在C#和JAVA这样的语言里,这不是个好办法。   办法二就是大家经常使用的,多线程,架锁。精巧的设计类,小心的使用这些来,管理各种资源的竞争。为了避免脏读,在C#以及JAVA里,架锁是一个可行的办法。但是这样会使得效率变低(锁架地多了,这个会更明显),更为关键是带来逻辑的复杂性。架锁的程序,可以说是一个“正确但是脆弱”的程序。离开了初创人员

Orleans介绍

我的梦境 提交于 2019-11-27 12:37:58
一、介绍 Orleans是一个框架,提供了一个直接的方法来构建分布式高规模计算应用程序 默认可扩展 -》 Orleans处理构建分布式系统的复杂性,使您的应用程序能够扩展到数百台服务器。 低延迟 -》 Orleans允许你在内存中保持你需要的状态,所以你的应用程序可以快速响应传入的请求。 简化的并发性 -》 Orleans允许你编写简单的单线程C#代码,处理异步消息在对象(Grains)之间传递的并发性。 在Orleans,Grains是应用程序代码的基石。Grains是实现一致性接口的.net类的实例。接口的异步方法用于指示Grains可以执行哪些操作 public interface IMyGrain : IGrainWithStringKey { Task<string> SayHello(string name); } 这个实现是在Orleans框架内执行的: public class MyGrain : IMyGrain { public Task<string> SayHello(string name) { return Task.FromResult($"Hello {name}"); } } 然后你可以通过获取一个代理对象(一个Grains参考)来调用grain,然后调用这些方法: var grain = GrainClient.GrainFactory

Orleans 整体介绍

≡放荡痞女 提交于 2019-11-25 21:57:01
背景 Orleans 是微软开源的Actor模型开发框架。 Actor模型 此模型解决了并发编程时对资源竞争使用的问题,将对同一个业务数据的访问从并行变为串行执行,降低了多线程编程的难度,使普通编程人员也能轻松编写高并发应用。 特点 Orleans的主要特点是通过框架提升开发人员的效率,并默认提供对应用系统横向扩展的能力,即使是普通开发人员也能轻松的完成。 提高开发效率 Orleans通过提供以下这些关键抽象、运行保证、系统服务来提高开发人员的效率,并不在意开发人员是否是并发编程专家。 熟悉的OOP IGrain声明了一些异步的方法, Grains负责实现他们,是不是很熟悉?我们可以像调用本地方法一样去调用这些远程的Grain方法,Orleans负责将它们转换为消息并在网络上传输、调度。 Grain的单线程执行 Orleans保证了一个Grain不会在多个线程上执行(通过primaryKey区分Grain),编程人员永远不用担心在Grain层面的并发问题,也不需要使用锁或其它同步机制来保证对共享数据的访问。 透明激活 Grain仅当要处理消息时才会激活,不同于普通的类实例需要实例化或释放,Grain只有激活和休眠两种状态,并且可以在不同的硬件设备中迁移,实现动态、自适应的负载均衡,并且开发人员不需关心这些具体细节。 透明传输 开发人员调用Grain时