写点什么

视频游戏《光环 4》的 Actor 模型设计和实现

  • 2015-03-18
  • 本文字数:1257 字

    阅读完需:约 4 分钟

在开始设计光环(Halo)系列视频游戏的下一代——光环4 的时候,现有的游戏引擎与可用的服务已经无法满足游戏的需求了,因此开发者基于 Actor 模型设计了一套全新的解决方案,并使用 Orleans 框架完成了这套模型的实现。在 QCon 伦敦大会上, Caitie McCaffrey 在演讲中为听众介绍了他们设计与创建这个新游戏背后的服务的过程。

McCaffrey 原本在微软游戏工作室就职,目前则在 Twitter 担任分布式系统工程师的职位。他提到了在游戏开发过程中所遇到的一个架构上的挑战,是如何设计该游戏将要面对的海量访问的负载。在光环 4 上线当天,共有 100 万独立在线用户参与了游戏,这个数字在一周之内就上升到了 400 位,游戏时间总和超过了 3000 万小时。为了应对如此庞大的负载,该项目选择了在云端进行托管,更具体地说是托管在 Azure 上,毕竟光环 4 是微软所推出的游戏。其它的挑战还包括如何保证游戏能够始终在线运行,这就要求服务器永远保持可用状态,还要尽量降低延迟,并且提高并发能力。

在寻找能够满足该项目需求的解决方案过程中,项目组的目光投向了 Actor 模型。从本质上说,Actor(角色)是并发的基础,该模型的核心概念在于:作为并发计算的基元,每个 Actor 将通过异步消息发送的方式与另一个 Actor 进行通信。当某个 Actor 收到一条消息之后,它可以选择将消息发送给其它 Actor,或是创建一个新的 Actor,也可以修改它的内部状态。这样一来,就能够高效地将某个 Actor 的所有数据保存在同一个地方,因此 McCaffrey 和他的团队通过实现这些保持状态的服务,创建了一套能够保持状态的中间层,它一方面具有缓存的高性能优点,另一方面也不会产生由于并发造成的问题。

项目组在微软内部四处寻找可行的方案,他们最终发现了 Orleans 框架,这是一个用于创建基于 Actor 模型的分布式系统的运行时与编程模型。Orleans 框架与其它 Actor 模型框架最重要的不同之处在于它所独有的概念:虚拟 Actor。这个虚拟 Actor 永远不会被创建或是销毁,从逻辑上来说它是永远存在的。虚拟 Actor 所具有的关键思想,一是地址的透明性,即发送给某个 Actor 的消息会被自动路由至该 Actor,无论该 Actor 的地址在哪里;二是能够在不重新进行部署的情况下进行自动横向扩展。

McCaffrey 声称,在使用了新技术的全新架构中,服务器的 CPU 利用率能够持续稳定在 90% 的水平上,并且能够实现接近线性增长的可扩展性,能够轻易地应对负载的变量,这一点在访问量突发性增长的时刻相当实用,例如当游戏刚刚上线的时候。

McCaffrey 相信,如果没有 Orleans 这个框架,光环 4 的项目就不可能获得成功。由于 Orleans 能够为开发者编写在分布式环境中运行的代码提供极大的帮助,因此寻找合适的开发者也变得简单了许多。并且由于它提高了开发者的生产力,因此开发者能够专注于提高游戏的用户体验,让它的表现更加出色。

McCaffrey 在一篇较早的博客帖子中,曾经介绍了使用 Orleans创建RESTful 服务的过程。

对于实现Actor 模型的不同途径,InfoQ 之前曾经专门进行过讨论和报告

查看英文原文: Building Halo 4, a Video Game, Using Actor Model

2015-03-18 06:123060
用户头像

发布了 428 篇内容, 共 184.1 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

APP 防重放实现

草原狼

安全 API 防重放

如何处理分析Flink作业反压的问题?

华为云开发者联盟

实时计算 DWS Flink作业 反压 Sink

加码技术破圈创新,蚂蚁金融科技助力各行各业转型升级

Lily

用户路径地图与漏洞模型

思亭

用户路径地图 漏洞模型

ECMAScript 2018(ES9)新特性简介

程序那些事

JavaScript ecmascript 程序那些事 es9

Python OpenCV 之像素的加减法,取经之旅第 15 天

梦想橡皮擦

3月日更

kylin基本概念和原理

潮湿了我押韵的心情

区块链推动知识产权数字化,区块链在知识产权中的价值体现

13828808769

区块链+ #区块链#

JVM 诊断之 jstat 工具使用

hepingfly

Java JVM jvm调优 jstat

CountDownLatch:别浪,等人齐再团!

王磊

Java 多线程

C++中结构体的定义

Jack—Li

有趣!一行代码居然无法获取请求的完整URL

Gopher指北

HTTP Go 语言

腾讯游戏实时计算应用平台建设实践

Apache Flink

flink

API 工具链研发的理论基础 - 流派

李宇飞

工具链 API

Kubernetes v1.21 新特性预览

倪朋飞

Kubernetes 云原生

订单和产品的多对多表关系在crudapi系统零代码实现

crudapi

API crud crudapi 一对多 多对一

BI大数据分析系统开发,助力企业数字化转型

13828808769

区块链 区块链+ #区块链#

「产品经理训练营0期」第八周作业

🌟

产品 产品经理训练营

centos7docker安装

happlyfox

Docker 学习 3月日更

CSP-J/S必备知识——文件输入输出

Jack—Li

从两个模型带你了解DAOS 分布式异步对象存储

华为云开发者联盟

开源 对象存储 存储 分布式异步对象存储 NVM

Rust从0到1-基础概念-控制流

rust 控制流

带你全面认识CMMI V2.0(四)——管理 赋能

IPD产品研发管理

项目管理 CMMI

面向复杂度架构设计的思考

Simon

架构实战营

SpringCloud技术专题-Hystrix以及FeginClient异常

码界西柚

SpringCloud Fegin

AI 事件驱动场景 Serverless 实践

Serverless Devs

Kubernetes 云原生 #Serverless

搭建 Mac 系统下的 C++开发环境

Jack—Li

第8周用户路径数据分析作业

skylar

Redis 如何应对并发访问

escray

redis 学习 极客时间 3月日更 Redis 核心技术与实战

NA(Nirvana) Chain主打应用而生NA公链NAC公链

区块链第一资讯

爱奇艺大数据生态的实时化建设

Apache Flink

flink 实时计算

视频游戏《光环4》的Actor模型设计和实现_DevOps & 平台工程_Jan Stenberg_InfoQ精选文章