目录

  • 为什么我们用 Orleans
  • Dapr VS Orleans
  • Actor 模型
  • Orleans 的核心概念

为什么我们用 Orleans

  • 分布式系统开发、测试的难度(服务发现、通信)
  • 运维的复杂度(伸缩性与可靠性的保障)
  • actor 拥有全局唯一身份
  • 自动伸缩功能

Dapr VS Orleans

Dapr 文档:https://docs.dapr.io

Orleans 文档:https://learn.microsoft.com/zh-cn/dotnet/orleans

Dapr Orleans
runtime 运行时 framework 框架
actor 只是其中的一个组件 actor + state
无分布式事务方案 提供最终一致性保障
依赖于 dapr 运行时 无除了 .net 环境的依赖
比较难进行 debug 调试开发无差别
docker 与 k8s 支持 裸金属/docker/k8s 支持
多种语言 sdk 支持 仅 C# 语言
1.8 版本 3.6 版本,4.0 即将发布

Actor 模型

  • 对同一个 actor 的调用按顺序执行
  • one actor 可以创建其他的 actor
  • 给一个 actor 发消息(调用它的执行方法)
  • 不能自己去实例化和销毁
  • 同一个 identity 的 grain 在系统内只存在一共激活的实例
  • actor 没有共享数据
  • actor 的数据不可用被外部直接修改

我们有个工作 jd001,就是一个 actor,它会有一个 internal state,状态里面会有一个 identity,它是唯一的,不可改变的

有一个浏览工作的消息,它把工作的 id,以及当前的浏览者信息传入进来,调用 jd001

jd001 会创建一个 activity actor ac001,然后调用 ac001 把浏览记录下来,有一个活动类型 view

Orleans 的核心概念

  • 单线程执行模型
  • 多路通信复用
  • 其他优势
  • Grain
  • 集群
  • 最佳实践

单线程执行模型

actor 在 Orlean 中叫作 grain 谷仓

运行时保证 grain 每次永远不会在多个线程上执行,通过结合与其他 grain 的隔离,程序员绝不会在 grain 级别面临并发情况,因此绝不会需要使用锁或者其他同步机制来控制对共享数据的访问,非专家级程序员只需此功能便可方便地控制分布式应用程序的开发

多路通信复用

Orlean 中的 grain 具有逻辑终结点,它们之间的消息传送跨一组固定的全交换物理连接(TCP 套接字)进行多路复用,这使得运行时能够托管数百万个可寻址实体,并且每个 grain 的操作系统开销很低,此外,在注册/取消注册物理终结点(例如 TCP 端口或 HTTP URL)甚至关闭 TCP 连接时,激活和取消激活 grain 都不会产生成本

其他优势

  • 熟悉的面向对象的编程(OOP)范式(grain 即是 .net 类)
  • 激活透明
  • 位置透明
  • 自动传播错误
  • 自适应资源管理

高性能

  • 显示异步
  • 多路复用通信
  • 高效计划:运行时在自定义线程池中计划大量单线程 grain 的执行(每个物理处理器核心一个线程),借助采用非阻塞基于延续的样式(Orleans 编程模型的一个要求)编写的 grain 代码,应用程序代码会以非常高效的“协作”多线程方式来运行,没有任何争用,这允许系统达到较高吞吐量,并以很高稳定性采用非常高的 CPU 使用率(高达 90% 以上)运行。

Grain

  • 概念
  • 模式
  • 持久化
  • 特点
  • 计时器和提醒

概念

grain = identity + behavior [ + state ]

  • identity : User/davidgri
  • behavior : class User : Grain, Iuser
  • state : in-memory, persisted, or stateless

模式

  • silo 内模式(集群内)
  • silo 外 client-server 模式(集群外:客户端、服务端不在同一个 host 里面)

持久化

激活 grain 时,会自动读取 grain 状态,但 grain 需要负责在必要时显示触发任何已更改的 grain 状态的写入

IPersistentState<TState>

Grain<TState>(已过时)

通过 MongoDB 持久化

Orleans.Providers.MongoDB: https://github.com/OrleansContrib/Orleans.Providers.MongoDB

特点

  • Grain 类似于对象,但是,它们是分布式的,虚拟的并且异步的
  • 它们是松散耦合、隔离并且基本上独立的
  • 避免在 grain 之间进行琐碎通信
    • 直接使用内存比传递消息的开销要小得多
    • 将过于琐碎的 grain 组合成单个 grain 可能更好
    • 需要考虑参数和序列化的复杂性/大小
    • 反序列化两次可能比重新发送二进制消息的开销更大
  • 避免瓶颈 grain

计时器和提醒

Timer && Reminder:https://learn.microsoft.com/zh-cn/dotnet/orleans/grains/timers-and-reminders

集群

Orleans silo 生命周期概述:https://learn.microsoft.com/zh-cn/dotnet/orleans/host/silo-lifecycle

Kubernetes 托管:https://learn.microsoft.com/zh-cn/dotnet/orleans/deployment/kubernetes

最佳实践

哪些应用适合采用 Orleans

  • 有大量(数百、数百万、数十亿甚至数万亿)松散耦合的实体
  • 实体足够小、可以是单线程实体
  • 工作负载是交互式的
  • 预期或可能需要多台服务器
  • 不需要全局协调、或者每次只需在少量几个实体之间进行小规模协调

哪些不适合

  • 必须在实体之间共享内存
  • 少量的大实体可以是多线程实体
  • 需要全局协调和/或一致性
  • 长时间运行的操作

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构一)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记

    2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记

    2.5.3 MongoDB -- 写入和查询 写入 查询 查找操作符 逻辑操作符 其他 嵌套对象 数组 游标方法 写入 https://docs.mongodb.com/manual/tutorial ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记

    2.5.4 MongoDB -- 更新和删除 整体更新 更新字段 字段操作 数组操作 删除 https://docs.mongodb.com/manual/reference/operator/upd ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ 工作队列和交换机)--学习笔记

    2.6.4 RabbitMQ -- 工作队列和交换机 WorkQueue Publish/Subscribe Routing EmitLog WorkQueue WorkQueue:https://w ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 详解)--学习笔记

    2.6.7 RabbitMQ -- Masstransit 详解 Consumer 消费者 Producer 生产者 Request-Response 请求-响应 Consumer 消费者 在 Mas ...

  6. Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记

    目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...

  7. 资深P7架构师详解淘宝服务端高并发分布式架构演进之路

    1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则. ...

  8. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  9. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  10. 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET

    荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 途牛谭俊青:多数据中心状态同步&am ...

随机推荐

  1. typora基础和计算机五大组成部分

    typora typora软件 ​ 是一款适合于IT行业文本编辑器,笔记,当下来说,非常火爆,可以使用多种语言,python java... ​ 安装的时候路径选择可以设置一些简单便于后续查找的文件路 ...

  2. JSP实现登录删除添加星座等(带样式)

    功能要求 1.完成两个页面 2.第一个登陆页面login. jsp 3.第二个用户管理页面useManage. jsp 4.有登录功能(能进行用户名密码的校验,用户名若为自己的学号密码为班级号,允许登 ...

  3. HFS局域网分享文件的神器(附下载链接)

    温馨提示,下载链接在页末 前言 假如说你需要传递个学习资料给好基友,我们有许多种方式可选:硬盘媒介.网络分享等. 要是论速度,还是得拿3.0或以上的U盘来拷贝,确实神速哈哈.但是其也有局限性,比如需要 ...

  4. Java实现7种常见密码算法

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...

  5. MySQL 主从复制一主两从环境配置实战

    MySQL 初始化 MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式;从节点可以复制主数据库中的所有数据库或者特定的数据库 ...

  6. 知识图谱-生物信息学-医学论文(Chip-2022)-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用

    16.(2022)Chip-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用 论文标题: Construction and Application of Chinese Breast Cance ...

  7. 从源码入手探究一个因useImperativeHandle引起的Bug

    今天本来正在工位上写着一段很普通的业务代码,将其简化后大致如下: function App(props: any) { // 父组件 const subRef = useRef<any>( ...

  8. CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别

    CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别 总结: "value 是完整单词" 类型的比较符号: ~=, |= "拼接字符串" 类型的比较 ...

  9. Java开发学习(三十九)----SpringBoot整合mybatis

    一.回顾Spring整合Mybatis Spring 整合 Mybatis 需要定义很多配置类 SpringConfig 配置类 导入 JdbcConfig 配置类 导入 MybatisConfig ...

  10. shell脚本之一键部署openV~P~N

    提前准备:/root目录下: checkpsw.sh ## 官方提供的自定义脚本,可在http://openvpn.se/files/other/checkpsw.sh下载 openvpn@.serv ...