C++浅谈Actor模型及其应用

news2024/10/7 16:27:18

文章目录

  • 0 引入
  • 1、理解
    • 1.1 为什么会出现Actor这种模型呢?
    • 1.2 Actor如何解决
  • 2、应用
    • 1.SkyNet
    • 2.Erlang
    • 3.RabbitMQ
  • 3、引用


在这里插入图片描述

0 引入

最近发现Actor模型其实我在工作中已经不知不觉实现了,最起码有这些影子。


1、理解

Actor模型是一种轻量级的并发编程模型,它将并发程序看作是一组相互独立的、互相发送消息的Actor(类似于面向对象编程中的对象),每个Actor都有自己的状态和行为,它们之间通过异步消息传递进行通信,Actor模型非常适用于多个组件独立工作,相互之间仅仅依靠消息传递的情况

特点:

  1. 更加面向对象:Actor类似面向对象编程(OO)中的对象,每个Actor实例封装了自己相关的状态,并且和其他Actor处于物理隔离状态
  2. 无锁:每个Actor之间通过消息传递信息,多个线程在执行共享资源需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题。Actor内部是以单线程的模式来执行的;
  3. 异步:actor根据消息队列处理自己的逻辑;
  4. 隔离:每个actor都是独立的个体;
  5. 分布式:消息驱动(或者事务驱动);
  6. 缺点:由于是分布式,群体的集合信息搜集不是他的强项,需要统一强实时性也有点不好实现(因为是异步结构)。

在这里插入图片描述

1.1 为什么会出现Actor这种模型呢?

以银行的账户为例子,最基本功能:存钱和取钱,那么对于一个账户来说存钱和取钱不能同时是进行,需要加一个锁(或者其他能够保证资源只能被唯一占有方法都行),保证账户安全性。
这个锁虽然保证了账户的安全性,但是确实花费了存钱和取钱的效率;

再往下看:旺财的账户A向小强B账户转账:先从账户A取钱(锁住),在向B账户存钱(锁住),只有这两项都成功,这个转账才生效(属于严格的原子操作),在解锁执行后续操作。。。

如果同时,旺财的账户A向小强B账户转账,小强B账户转账向 旺财的账户A 这就会出现死锁的可能,当然通过排序也可以解决这个过程,但是浪费时间。

1.2 Actor如何解决

(从引用截了一张图)
在这里插入图片描述
从上面给可以看出,引入一个第三方转账管家(也可以认为是统一消息管理者),小强和旺财想要做的事情通过Message传给他。再有他把事情安排安排下去,当然这里如何保证转账的原子性,那就需要有一个事务追踪(标记)。
此时就有一个问题,如果转账失败需要回滚,那么整个Actor处理的话就比较麻烦了
所以再此基础上,可以将整个系统添加一些管理者:
1、建立一个Actor管理者,负责监控Actor的创建销毁;
2、可以额外增加一个错误/日志消息管理者;

这些都是根据实际系统架构需求来补充,让整个流程更流畅,避免公共资源的使用。


2、应用

1.SkyNet

  • 游戏界有名的编程大神云风,(《西游》了解一下,我也看过他写的那本《游戏之旅——我的编程感悟》)
    云风的skynet,定义为一个游戏服务器框架,用C语言,(一开始的第一版基于Erlang实现)
    lua(其实这个框架在早期的类传奇类游戏大部分使用这个)基于Actor模型实现。代码极其精简,c部分的代码只有三千行左右。
  • 整个skynet框架要解决的核心问题是:把一个消息(数据包)从一个服务(Actor)发送给另一个服务(Actor),并接收其返回。也就是在同一进程内(作者也强调并非只限于同一进程,因为可能会有集群间的通讯)的一个服务通过类似rpc之类的调用同一进程内的另外一个服务,并接收处理结果。而skynet就是处理这些服务间发送数据包的规则和正确性。
  • 源码网上已经开源,github有,感兴趣可以去阅读。

2.Erlang

  • 1998年Erlang开源,2006年传入国内C++程序员圈,Erlang China User
    Group始于2007,现改名为Effective Cloud User Group
  • 并行和分布式
    Erlang采用的Actor模式使其增长并行处理,错误处理机制和储存管理为分布式服务,Erlang并不擅长存储密集型数值计算。

3.RabbitMQ

  • RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议 )的开源实现,
    能够实现异步消息处理
  • RabbitMQ是一个消息代理:它接受和转发消息。
    -典型的使用场景: 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中,而不是不去响应出现卡死现象。

3、引用

1、深入理解Akka actor模型
2、分布式计算(3):分布式计算模式之Actor
3、Actor——Actor模型原理的通俗理解 (转)
4、从0到1用c++实现一个Actor模型


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

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

相关文章

Android--Jetpack--Lifecycle详解

富贵本无根,尽从勤里得 一,定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件(Activity/Fragment)生命周期状态信息,并且允许其观察者监听宿主生命周期状态变化。 顾名思义,Lifecycle的主…

[论文阅读]Sparse Fuse Dense

SFD Sparse Fuse Dense: Towards High Quality 3D Detection with Depth Completion 论文网址:SFD 论文代码:SFD 论文简读 本文主要关注如何利用深度完成技术提高三维目标检测的质量。论文提出了一种名为 SFD(Sparse Fuse Dense&#xff0…

SQL server 2016安装

1、关系数据库的基本概念。 行:每行成为一条“记录”或“元组”,用于描述一个对象的信息。 列:每列称为一个“字段”或“属性”,用于描述对象的一个属性。 2、主键与外键。 主键:键,即关键字。主键由一个或…

CentOS或RHEL安装vscode

下载rpm安装包 网络下载或者下载到本地再上传到服务器,点击访问国内下载地址,不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

高端网站设计公司 -蓝蓝设计数据可视化大屏服务

UI设计公司-蓝蓝设计(北京兰亭妙微科技有限公司)是一支由清华美院毕业的专业团队组成的设计公司。我们的设计师们在大屏科研信息软件UI设计领域拥有多年的工作经验和丰富的行业知识。我们对设计充满热爱,设计不仅是我们的专业和职业&#xff…

locked1勒索病毒,刚攻击完海康威视系统,又再针对速达软件服务器攻击

导言: .locked、.locked1勒索病毒正成为数字安全的一大威胁。本文91数据恢复将深入介绍.locked、.locked1勒索病毒的特点、如何有效恢复被其加密的数据文件,以及预防这一数字噩梦的方法。如果您正在经历勒索病毒数据恢复的困境,我们愿意与您…

【动态规划】LeetCode-62.不同路径

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

webGL开发学科演示项目方案

开发学科演示项目需要考虑到教育目标、互动性和用户体验。以下是一个可能的技术方案,可用于实现这样的项目,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.WebGL 框架: 选择…

java企业财务管理系统springboot+jsp

1、基本内容 (1)搭建基础环境,下载JDK、开发工具eclipse/idea。 (2)通过HTML/CSS/JS搭建前端框架。 (3)下载MySql数据库,设计数据库表,用于存储系统数据。 (4…

微信小程序自定义tabBar简易实现

文章目录 1.app.json设置custom为true开启自定义2.根目录创建自定义的tab文件3.app.js全局封装一个设置tabbar选中的方法4.在onshow中使用选中方法最终效果预览 1.app.json设置custom为true开启自定义 2.根目录创建自定义的tab文件 index.wxml <view class"tab-bar&quo…

Java零基础——vue篇

1.【熟悉】Vue简介 1.1 简介 它是一个构建用户界面的框架 Vue是一个前端框架 js jq https://www.pmdaniu.com/#file UI网站 UI 一般开发者使用蓝湖 工具 看着UI图 写接口 https://lanhuapp.com/web/#/item 是一个轻量级的MVVM&#xff08;Model-View-ViewModel&#xff0…

STM32学习笔记--闪存Flash

STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口&#xff08;外设&#xff09;可以对程序存储器和选项字节进行擦除和编程。 读写FLASH的用途&#xff1a;利用程序存储器的剩余空间来保存掉电不丢失的用户数据 &#xff0c;通过…

NodeJS(二):npm包管理工具、yarn、npx、pnpm工具等

目录 (一)npm包管理工具 1.了解npm 2.npm的配置文件 常见的配置属性 scripts属性*** 依赖的版本管理 3.npm安装包的细节 4.package-lock文件 5.npm install原理** 6.npm的其他命令 (二) 其他包管理工具 1.yarn工具 基本指令 2.cnpm工具 3.npx工具 (1)执行本地…

流媒体方案之FFmepeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦东山老师的视频来学习视频监控方案的相关知识&#xff0c;韦东山老师讲的课非常好&…

Syntax Error: TypeError: Cannot read properties of undefined (reading ‘styles‘)

日志只有这一行&#xff0c;比较难排查 排查途径&#xff1a; 1、从上图找到唯一的文件输出output.js&#xff0c;断点查看堆栈信息&#xff0c;如下图&#xff0c;可以看到这个错误是由于哪个文件引起的 以为从App.vue中定位到原因了&#xff0c;其实也不对&#xff0c;继续…

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

DynamicDataSource

DynamicDataSource 多数据源&#xff0c;读写分离&#xff0c;主从数据库

【力扣周赛】第 115 场双周赛(⭐优化背包DP)(TODO)

文章目录 竞赛链接Q1&#xff1a;2899. 上一个遍历的整数&#x1f4a9;&#xff08;阅读理解题&#xff0c;按题意模拟&#xff09;Q2&#xff1a;2900. 最长相邻不相等子序列 I&#xff08;贪心&#xff09;Q3&#xff1a;2901. 最长相邻不相等子序列 II&#xff08;类似 最长…

Seaborn图形可视化基础_Python数据分析与可视化

Seaborn图形可视化基础 Seaborn可视化Seaborn与Matplotlib Seaborn可视化 即使matplotlib已经如此强大了&#xff0c;但是不得不承认它不支持的功能还有很多。 例如&#xff1a; 2.0之前的版本的默认配置样式绝对不是用户的最佳选择&#xff1b; matplotlib的API比较底层。虽…

如何下载IEEE出版社的Journal/Conference/Magazine的LaTeX/Word模板

当你准备撰写一篇学术论文或会议论文时&#xff0c;使用IEEE&#xff08;电气和电子工程师协会&#xff09;的LaTeX或Word模板是一种非常有效的方式&#xff0c;它可以帮助你确保你的文稿符合IEEE出版的要求。无论你是一名研究生生或一名资深学者&#xff0c;本教程将向你介绍如…