背景

Orleans
是微软开源的Actor模型开发框架。

Actor模型
此模型解决了并发编程时对资源竞争使用的问题,将对同一个业务数据的访问从并行变为串行执行,降低了多线程编程的难度,使普通编程人员也能轻松编写高并发应用。

特点

Orleans的主要特点是通过框架提升开发人员的效率,并默认提供对应用系统横向扩展的能力,即使是普通开发人员也能轻松的完成。

提高开发效率

Orleans通过提供以下这些关键抽象、运行保证、系统服务来提高开发人员的效率,并不在意开发人员是否是并发编程专家。

熟悉的OOP

IGrain声明了一些异步的方法, Grains负责实现他们,是不是很熟悉?我们可以像调用本地方法一样去调用这些远程的Grain方法,Orleans负责将它们转换为消息并在网络上传输、调度。

Grain的单线程执行

Orleans保证了一个Grain不会在多个线程上执行(通过primaryKey区分Grain),编程人员永远不用担心在Grain层面的并发问题,也不需要使用锁或其它同步机制来保证对共享数据的访问。

透明激活

Grain仅当要处理消息时才会激活,不同于普通的类实例需要实例化或释放,Grain只有激活和休眠两种状态,并且可以在不同的硬件设备中迁移,实现动态、自适应的负载均衡,并且开发人员不需关心这些具体细节。

透明传输

开发人员调用Grain时,不需要知道Grain的物理位置在哪一个硬件设备上,只需要创建对Grain的逻辑引用。

集成持久化

Orleans允许将Grina的内存状态持久化到存储设备。它允许扩展或定制持久化提供程序,并保证只有在成功更新持久状态后才调用者才能收到结果。

自动传递错误

运行时使用异步和分布式try / catch的语义自动在调用链上传播未处理的错误。 因此,错误不会在应用程序中丢失。

这允许程序员将错误处理逻辑放在适当的位置,而无需在每个级别手动传播错误的繁琐工作。

默认情况下透明可伸缩性

Orleans 通过提供以下特性帮助开发人员将系统应用的可扩展性提升几个数量级;这是通过将最佳实践和成熟的模型相融合,并通过提供高效率、低学习成本的系统来达成这一目标。

应用状态的隐式细粒度划分

Orleans 使用 Grain 作为可直接访问的实体,程序员隐式地打破了应用程序的单体状态。Orleans 并没有规定 Grain 应该是多大或多小,但绝大多数情况下会有大量的 Grain,每个 Grain 代表了应用中的自然实体,例如用户、订单中,每个用户是一个单独的Grain,可通过UserId做为primaryKey来区分各个UserGrain。由于Grain的独立性,并且物理位置被抽象为了逻辑位置,所以Orleans在负载均衡和热点处理方面具有极大的灵活性,并且不需要开发人员考虑这些部分。

自适应的资源管理

当 Grain 互相调用时,它们不需要去猜测其它 Grain 的位置。因为框架具有位置透明的特性,Runtime 可以动态管理和调整可用硬件资源的分配,通过对集群中的 Grain 的动态迁移来保证负载,而不会使传入的请求失败。通过创建特定Grain的多个副本,保证吞吐量,而无需修改应用程序代码。

多路通信

Grain 采用的是逻辑地址,并且它们之间的消息传递在Tcp socket上多路复通,这允许Runtime 托管数百万个具有极低开销的Grain。另外,激活和停用 Grain 不会产生 Socket 成本。

高效的调度

Runtime 可以执行大规模的单线程 Grain 调度,使用非阻塞、基于连续方式编写 Grain,应用程序以非常有效的协程方式运行,这使系统通够达到高吞吐量并以非常高的CPU利用率运行,并具有极高的稳定性。事实上,系统中的Grain数量增加和负载的增加不会导致额外的线程或其它的系统开销,这有利于单个节点和整个系统的扩展。

显式异步

Orleans 框架中分布式应用程序的异步特点明确,旨在指导程序员编写非阻塞异步代码。结合异步消息传递和高效的调度,开发人员无需使用多线程编程技术即可实现大规模的分布式并行性和总体吞吐量。

作者:_黑冰_
链接:https://www.jianshu.com/p/eb1bb81b8ab6

Orleans 整体介绍的更多相关文章

  1. Java 并发编程整体介绍 | 内含超多干货

    前段时间一直在学习多线程相关的知识,目前也算有了一个整体的认识,今天呢,主要从整体介绍一下,只谈造火箭,拧螺丝这种细节还需要自己深究. 首先是操作系统级别对于多线程的支持,由 CPU 的多级缓存.缓存 ...

  2. SNF快速开发平台--规则引擎整体介绍及使用说明书

    一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...

  3. PyQt5整体介绍

    1 PyQt5整体介绍 PyQt5是基于图形程序框架Qt5的Python语言实现,由一组Python模块构成. PyQt5的官方网站是:www.riverbankcomputing.co.uk. Py ...

  4. [置顶] API相关工作过往的总结之整体介绍

    此系列的总结文章,仅仅是我个人工作总结,有考虑不周之处还请各位同行多多指教. API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是 ...

  5. ZooKeeper系列(1) 整体介绍(转)

    原文地址:https://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术. ...

  6. Spark Streaming之一:整体介绍

    提到Spark Streaming,我们不得不说一下BDAS(Berkeley Data Analytics Stack),这个伯克利大学提出的关于数据分析的软件栈.从它的视角来看,目前的大数据处理可 ...

  7. Apache Flink 整体介绍

    前言 Flink 是一种流式计算框架,为什么我会接触到 Flink 呢?因为我目前在负责的是监控平台的告警部分,负责采集到的监控数据会直接往 kafka 里塞,然后告警这边需要从 kafka topi ...

  8. MINA系列学习-mina整体介绍

    今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者类的方法.我倒是想从mina源码的结构和功能上对这个框架进行剖析.源码的阅 ...

  9. Java Executor并发框架(一)整体介绍

    一.概述 Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池.在jdk1.5以前的版本中,线程池的使用是及其简陋的,但是在 ...

随机推荐

  1. import: not authorized `time' @ error/constitute.c/WriteImage/1028. import: not authorized `rospy' @ error/constitute.c/WriteImage/1028.

  2. duilib教程之duilib入门简明教程5.自绘标题栏

    如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦.    duilib其实并没有区分标题栏和 ...

  3. python下使用ElasticSearch

    一 什么是 ElasticSearch Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elas ...

  4. HTTP的九种请求方法

    HTTP1.0定义了三种请求方法:GET.POST.HEAD HTTP1.1定义了六种请求方法:PUT.DELETE.PATCH.OPTIONS.CONNECT.TRACE 1.get 请求指定页面的 ...

  5. Java-MyBatis-MyBatis3-XML映射文件:XML映射文件

    ylbtech-Java-MyBatis-MyBatis3-XML映射文件:XML映射文件 1. XML 映射文件 MyBatis 的真正强大在于它的映射语句,这是它的魔力所在.由于它的异常强大,映射 ...

  6. JEECMS文库工具安装

    下载地址: Swftools下载地址 http://www.swftools.org/swftools-0.9.2.tar.gz openoffice下载地址 http://www.openoffic ...

  7. ucore 地址映射的几个阶段

    第零阶段: 启动之后的实模式阶段 vir = lin = pa 第一阶段 : 启动 bootloader 的段式分页 这里段基址是0 ,所以地址空间维持不变 vir addr = lin addr = ...

  8. Activiti 变量设置

    使用工作流的时候必定会附上一些变量.例如,请假的时候有填写请假理由,天数等等.可以用以下代码实现 public void setVariables(){ /**与任务(正在执行)*/ TaskServ ...

  9. error LNK2005:"private:__thiscall编译错误

    对于这种编译错误,网上给出了很多解决办法,大部分都是忽略特定库,或者改变多线程调试DLL,但是均没有效果. 这里记录下自己的解决方法,首先按照下图,取消从父级或项目默认设置继承,避免与其他库中的定义冲 ...

  10. 19-10-17-T

    真的T了.(滑稽 Final 35 Miemeng 100 03:12:51 0 03:12:54 15 03:12:55 115 03:12:55 幸好$T1$还能要,不然就…… 前言 中午$\sc ...