Actor模型

深入解析actor 模型(一): actor 介绍及在游戏行业应用 1 介绍 1.1 什么是actor 对于刚接触actor的我,第一感觉就像redis一样,每个actor就是一个redis 实例,都有自己消息队列,actor相互通信通过将消息发给对方,消息发送进对方的消息队列,等待对方线程处理。来看看我们之前做项目的痛点。 游戏服务器通常分为多个服,每个服上有多个玩家。假设玩家与玩家数据交互操作,这时怎么避免数据竞争?两种解决方案: 1、将数据写入redis 首先redis效率高,也是单线程模型,不存在数据竞争,但是也有它的不足之处,操作redis 会受网络影响 阅读详情

1.Actor模型
在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成

状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态
邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息
Actor的基础就是消息传递
2.使用Actor模型的好处:
事件模型驱动–Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情
强隔离性–Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要
观察到另一个Actor的状态变化只能通过消息传递进行询问
位置透明–无论Actor地址是在本地还是在远程机上对于代码来说都是一样的
轻量性–Actor是非常轻量的计算单机,单个Actor仅占400多字节,只需少量内存就能达到高并发
3.Actor模型原理
以下通过学生与教师之间的邮件通信来理解akka中的Actor模型

学生-教师的消息传递
首先先只考虑学生单向发送消息给教师(学生—>教师),如下图:
在这里插入图片描述
图解:

1.学生创建一个ActorSystem
2.通过ActorSystem创建ActorRef,将QuoteRequest消息发送到ActorRef(教师代理)
3.ActorRef(教师代理)消息传递到Dispatcher中
4.Dispatcher依次的将消息发送到TeacherActor的邮箱中
5.Dispatcher将邮箱推送到一条线程中
6.邮箱取出一条消息并委派给TeacherActor的receive方法
下面再详细的解释每一步骤

StudentSimulatorApp主程序详解:
首先StudentSimulatorApp会先启动JVM并初始化ActorSystem
在这里插入图片描述
如上图所示,StudentSimulatorApp的主要工作为:

1.创建ActorSystem
ActorSystem作为顶级Actor,可以创建和停止Actors,甚至可关闭整个Actor环境,
此外Actors是按层次划分的,ActorSystem就好比Java中的Object对象,Scala中的Any,
是所有Actors的根,当你通过ActorSystem的actof方法创建Actor时,实际就是在ActorSystem
下创建了一个子Actor。
可通过以下代码来初始化ActorSystem

	val system = ActorSystem("UniversityMessageSystem")

2.通过ActorSystem创建TeacherActor的代理(ActorRef)
看看TeacherActor的代理的创建代码

val teacherActorRef:ActorRef = system.actorOf(Props[TeacherActor])

ActorSystem通过actorOf创建Actor,但其并不返回TeacherActor而是返
回一个类型为ActorRef的东西。
ActorRef作为Actor的代理,使得客户端并不直接与Actor对话,这种Actor
模型也是为了避免TeacherActor的自定义/私有方法或变量被直接访问,所
以你最好将消息发送给ActorRef,由它去传递给目标Actor

3.发送QuoteRequest消息到代理中
你只需通过!方法将QuoteReques消息发送给ActorRef(注意:ActorRef也有个tell方法,其作用就委托回调给!)

	techerActorRef!QuoteRequest
等价于teacherActorRef.tell(QuoteRequest, teacherActorRef)

完整StudentSimulatorApp代码

object StudentSimulatorApp extends App{
 //初始化ActorSystem
 val actorSystem=ActorSystem("UniversityMessageSystem")
 //构建teacherActorRef
 val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
 //发送消息给TeacherActor
 teacherActorRef! QuoteRequest
 Thread.sleep (2000)
 //关闭 ActorSystem,如果不关闭JVM将不会退出
 actorSystem.shutdown()
}

QuoteRequest类

object TeacherProtocol{
 case class QuoteRequest() //请求
 case class QuoteResponse(quoteString:String) //响应
}

Dispatcher和MailBox
ActorRef将消息处理能力委派给Dispatcher,实际上,当我们创建ActorSystem和ActorRef时,
Dispatcher和MailBox就已经被创建了
在这里插入图片描述
MailBox
每个Actor都有一个MailBox,同样,Teacher也有个MailBox,其会检查MailBox并处理消息。
MailBox内部采用的是FIFO队列来存储消息,有一点不同的是,现实中我们的最新邮件
会在邮箱的最前面。

Dispatcher
Dispatcher从ActorRef中获取消息并传递给MailBox,Dispatcher封装了一个线程池,之后在
线程池中执行MailBox。

protected[akka] override def registerForExecution(mbox: Mailbox, ...): Boolean = {
  ...
 try {
 executorService execute mbox
 ...
}

为什么能执行MailBox?
看看MailBox的实现,没错,其实现了Runnable接口

private[akka] abstract class Mailbox(val messageQueue: MessageQueue) extends SystemMessageQueue with Runnable

在这里插入图片描述
当ActorRef发送消息调用目标Actor的reveive方法时,MailBox中的run方法被执行,接着从消息队列中取出一条消息并传递给Actor处理

class TeacherActor extends Actor {
 val quotes = List(
  "Moderation is for cowards",
  "Anything worth doing is worth overdoing",
  "The trouble is you think you have time",
  "You never gonna know if you never even try")
 def receive = {
  case QuoteRequest => {
  import util.Random
  //从list中随机选出一条消息作为回应(这里只print并没回应学生的请求)
  val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
  println (quoteResponse)
  }
 }
}
TeacherActor的receive方法将匹配QuoteRequest消息

转自https://www.cnblogs.com/williamjie/p/9466357.html

Akka学习笔记(二):Actor Systems Akka学习笔记(二):Actor Systems 图中表示的是一个Actor System,它显示了在这个Actor System中最重要实体之间的关系。 什么是actor,是一个封装了状态和行为的对象,每个actor都通过message交流,从自己的mailbox中读取别的actor发送的消息。 注意: ActorSystem是重量级的对象,会创建1...N个线 阅读详情

相关推荐

C++ Actor并发模型框架 Actor Framework (CAF)

什么是ACTOR 并发模型 Actor 是一种处理并发计算的基本模型,主要概念是通过OO 面向对象思想,将计算单元独立成一个对象,在模型中成为Actor,各个独立计算单元之间的通信通过mailbox(邮箱),每个Actor维护自己的mailbox,ma ilbox存储的是需要消费的消息。这里扩散一下知识,在更早期出现的ESB(enterprise service bus)企业服务总线模型是将服务接到消息总线上,服务获取总线上投递给他的消息。 这种方式存在耦合,以及需要一个个服务进行确认,直到消费者进行确认消

BBinChina的专栏 6060

用Java实现Actor模型(模仿Skynet)

Actor模型是一种常见的并发模型,与最常见的并发模型——共享内存(同步锁)不同,它将程序分为许多独立的计算单元——Actor,每个Actor独立管理自己的资源,不同Actor之间通过消息传递来交互。它的好处是全异步执行,不会造成线程阻塞,从而提升CPU使用率,另外由于线程之间是异步交互,所以也不用考虑加锁和线程同步的问题。Actor模型在业界有许多应用,例如游戏服务器框架Skynet、编程语言Erlang。因为历史原因,Java下的Actor模型应用较少,知名的只有基于Scala的Akka。

长三月的游戏开发 2132

【Akka】Actor模型探索

Akka是什么Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的。通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台。在容错性方面我们采取了“let it crash”(让它崩溃)模型,人们已经将这种模型用在了电信行业,构建出“自愈合”的应用和永不停机的系统,取得了巨大成功。Actor还为透明的分布式系统以及真正的可扩展高容错应用的基础进行了抽象。Ak

Jason Ding的专栏 6416

Actor模型介绍与应用

actor模型介绍,akka介绍,自定义actor模型

weixin_44716895的博客 2545

actor 模型原理 (一)

actor模型很牛逼,很流行,但是我不会,妈的,国内搜出来的讲解actor的都看不太懂,讲不太清,下面哥们就翻译一下老外的文章,以粗浅的方式体会一下到底什么是actor模型? 多线程开发要处理并发,锁,线程同步等一系列问题,一不小心,弄个大的bug,所以一般都不愿意自己动手写,能不能换一种思路,可以不可以介绍一种更高级的抽象模型,让我想实现多线程应用的时候,不用再考虑这些底层问题呢?

tracymkgld的专栏 1万+

Actor模型和Reactor模型,Rust下的actix-web基于Actix Actor框架

在Rust中,Future是异步编程的核心概念,定义了一个可能会在未来某个时间点完成的计算。Future库提供了基本的异步操作和组合工具,使得开发者能够编写高效的非阻塞代码。Actix-web是一个基于Actixactor框架构建的高性能、极简易的Rust Web框架。它利用Rust的类型系统和高效的异步运行时,提供了快速、安全的Web开发体验。Actor模型和Reactor模型各有其适用场景,前者更适合复杂的并发与分布式系统,后者则在高性能I/O处理中表现卓越。Rust的Future。

m0_74825656的博客 1150

skynet actor模型

Skynet 中的 Actor 模型是一种用于构建分布式系统和并发应用的计算模型,它将计算过程分解为多个独立的、可以并发执行的 Actor 实体,以下是关于 Skynet 中 Actor 模型的详细介绍:

游戏全栈,技术合作 1959

Rust 中 Actor 并发模型的实践与使用

Actor模型是一种并行计算模型,提供了一种用于构建并发、分布式系统的形象办法。在Actor模型中,计算被示意为独立的、轻量级的计算单元,称为 Actor,能够发送和接管音讯并进行本地计算。作为一种通用的消息传递编程模型,被广泛用于构建大规模可伸缩分布式系统。其核心思想是独立保护隔离状态,并基于消息传递实现异步通信。

smilejiasmile的博客 2199

Reactor模型,Actor模型

背景 最近准备接手公司的消息系统,消息是系统是vert.x写的。突然觉得好懵逼,vert.x以前只听过名字,根本不知道是干啥的。然后开始了疯狂学习。此文是在学习vert.x过程中学到的知识。vert.x是一个reactor模型,actor模型。今天就给大家讲讲什么是reactor,actor模型。 传统模型 image 这种模式是传统设计,每一个请求到来时,大致都会按照:请求读取->请求解码->服务执行->编码响应->发送答复 这个流程去处理。服务器会分配一个线程..

红豆和绿豆的博客 2445

ThingsBoard的Actor模型

下面是我从网上查阅资料总结下来的.Actor模型,在1973由Carl Hewitt定义,被Erlang OTP推广,其消息传递更加符合面向对象的原始意图。Actor模型属于并发组件模型,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。

AldrichEugene 1205

actor-framework:C ++中Actor模型的开源实现

CAF:C ++ Actor框架 CAF是C ++ actor模型的开源实现,具有轻量级和快速的actor实现,消息的模式匹配,网络透明消息传递等。 在线资源 主页: : 开发者博客: : 手册: : Doxygen : : 报告错误/获得帮助 GitHub上的未解决问题: : 在StackOverflow上提问: : //stackoverflow.com/questions/ask tags c++-actor-framework 社区 聊天: : 推特: : 用户邮件列表: : 开发人员邮件列表: : 功能提案: : 获取CAF FreeBSD端口 我们为CAF维护一个端口,您可以按照以下步骤进行安装: pkg install caf 另外,您可以在安装端口之前转至/usr/ports/devel/caf并调整一些配置选项:

Actor模型概念

从实习到现在,一直在做Unity相关的业务,不知不觉中感觉已经不在关注服务器相关的技术了。一次偶然的机会再腾讯的gad平台上观看了云风在15年在腾讯做的skynet讲座(http://gad.qq.com/content/coursedetail/467),skynet是用c写的核心,lua做上层业务,基于actor模型的服务器框架,哈哈,这次学习actor模式的学习也是因此而起。 Acto

u014659211的专栏 2685

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 211

Actor模型原理

1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成 状态(state):Actor中的状态指的是Ac

long0801的博客 1134

保姆级教程:用NFS把群晖NAS的文件夹挂到Ubuntu 22.04上,实现文件无缝共享

本文提供了一份详细的教程,指导用户如何通过NFS协议将群晖NAS的文件夹挂载到Ubuntu 22.04系统上,实现文件的无缝共享。文章对比了NFS与SMB协议的性能差异,并提供了群晖端和Ubuntu端的配置指南、高级参数优化、自动挂载方案以及生产环境中的实战技巧,帮助用户提升文件共享效率和系统稳定性。

weixin_29213827的博客 405

IROS 2025机器人技术解析:从诡异设计到硬核应用

机器人技术正从传统的结构化环境应用,迈向复杂非结构化场景的深度交互。其核心原理在于通过仿生设计、多模态感知与智能控制算法,赋予机器人类似生物的适应性与交互能力。这一技术演进的价值在于突破传统机器人在极端环境、精密操作和自然交互中的瓶颈。例如,结合深度强化学习的全身动力学控制,使机器人能在废墟、管道等复杂地形中自主导航;而软体机器人技术则通过材料变形实现安全、柔顺的抓取操作。这些技术最终服务于极端环境巡检、精密装配和高端陪护等刚性应用场景,推动机器人从功能实现迈向与环境、人进行深度、智能交互的新阶段。

weixin_34006468的博客 449

Java中的Actor模型

Actor模型最早由Carl Hewitt在1973年提出,是一种数学模型,用于并发计算。在Actor模型中,最基本的执行单元是“actor”。每个actor都拥有自己的状态,并通过消息传递与其他actor进行通信【6†source】【7†source】。Actor模型提供了一种高效、可靠的并发编程方式,通过消息传递避免了传统多线程编程中的种种问题。在Java中,使用Akka框架可以方便地实现Actor模型,构建高性能的分布式系统。希望这篇文章能帮助你更好地理解和掌握Java中的Actor模型。

weixin_46372265的博客 1055

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

什么才是真正的Actor模型

什么才是真正的Actor模型 原创fireflyc写程序的康德2016-07-16 《Java并发原理无废话指南3》中表达了一个观点:Akka不是真正的Actor模型,JVM上不可能有真正的Actor模型。那么究竟什么才是真正的Acot模型?其实这个并没有准确的定义,下面我谈谈自己的看法。 Actor可以被认为是在用户空间实现的并发实体,所以它应该是应用级别的线程。如果认同这个观点那么Actor要满足的要求=操作系统对进程/线程提出的要求一样。 内存结构 每个并发实体都是要有一个固定的数据结构...

rxwoffice的博客 153

Halcon实战:如何快速找到图像中的多个圆并计算圆心距离(附完整代码)

本文详细介绍了Halcon在工业视觉检测中快速定位图像中的多个圆并计算圆心间距离的实战方法。通过两种核心算法(阈值分割和动态阈值)的对比分析,结合完整代码示例和参数调优技巧,帮助开发者高效解决多圆检测问题,提升工业检测精度与效率。

weixin_33701251的博客 316

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6231
上一篇: Kafka文件的存储机制
下一篇: zk维护kafkaoffset
Alwaysdazz
博客等级 码龄8年 24粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值