ET框架Actor Location:分布式MMO中实体迁移后消息如何可靠送达指南

ET框架Actor Location:分布式MMO中实体迁移后消息如何可靠送达指南 ET框架Actor Location分布式MMO中实体迁移后消息如何可靠送达指南【免费下载链接】ETUnity3D Client And C# Server Framework项目地址: https://gitcode.com/GitHub_Trending/et/ET做分线MMO时玩家从1线切到2线旧连接标识立刻失效再走一步消息就丢了。用ET框架Unity客户端加C#服务端的开源双端框架搭分布式游戏服务端这类问题是最高频的一类而它的Actor Location位置服务就是专门为此设计的解法。消息为什么在换线后会丢先分清两个标识符。ET里每个实体都有一个Entity.Id终身不变相当于身份证号而对象创建时分配的InstanceId只在所在进程内有效相当于居住证号。换城市进程证号就换发。标识符作用范围实体迁移进程后Entity.Id全局唯一永远不变InstanceId仅当前进程有效变成新号所以问题可以拆成三层消息要投递到具体某个实体发送方往往不知道这个实体现在在哪个进程实体还可能随时迁移地址可能在消息到达前就过期了。三层里任何一层没处理好消息就会丢。位置服务到底做了什么ET的Actor Location机制把这三层分开解决。第一层把实体自己变成邮箱。给实体挂上MailBoxComponent组件它就成为一个Actor消息排队逐条处理。像公司前台的快递架包裹按序放人按序取保证同一对象的逻辑绝不并发。第二层位置服务负责回答他在哪。框架部署一个Location进程所有挂信箱的实体创建时都会把Entity.Id和InstanceId的映射注册上去。发送方不知道地址时先查一次位置服务发送成功后缓存结果之后直接走缓存失败才重新查。第三层锁加重试负责处理地址过期。实体迁移前先删除本进程的记录再在位置服务上对自己的key加锁此时其他进程对同一key的请求会进入队列等待。迁移完成后解锁、更新新地址排队请求继续执行。如果消息真的发到了旧地址框架会自动重新查地址并重试最多5次仍失败才抛异常交给业务处理。// 发送方只拿Entity.Id发查地址、缓存、重试全在框架内部 var sender Game.Scene.GetComponentActorLocationSenderComponent() .Get(unitId); sender.Send(actorLocationMessage);看懂这三层之后你可以跟着走一遍从跑起demo到验证位置服务本身。四步把ET的Actor Location跑起来克隆仓库git clone https://gitcode.com/GitHub_Trending/et/ET注意必须clone新工程不要在旧工程里覆盖。初始化项目根目录执行pwsh ./Scripts/Initialize-Project.ps1。环境要求.NET 8和Unity 2022.3.62Book/1.1运行指南.md列了完整依赖清单。跑demo用Unity打开工程后双击 Packages/cn.etetet.statesync/Scenes/Init.unity点Play客户端登录流程会完整走一遍。验证位置服务项目根目录执行Test --NameActorlocation_.* | dotnet ./Bin/ET.App.dll --SceneNameTest12条位置服务用例全部通过说明注册、查询、锁、重试这条链路是通的。跑通之后这套机制的承载能力可以看看仓库里已有的数据。这套机制扛得住多少量README里的Benchmark记录100万次PingPong消息往返平均耗时4秒左右也就是平均每秒收发20万条消息远超主线程需求。商业项目《千古风流》线上跑的是64核128G单物理机1.5万在线策划为生态限制到6000人时CPU占用约30%Release版还能翻倍到3万在线。另外Packages/cn.etetet.actorlocation/包内自带12条测试用例覆盖锁超时自动解锁、迁移重试、多类型存储等场景位置服务每次改动都有回归保障。能力有了日常开发里还有几个高频坑值得先知道。高频坑点速查现象A调B、B调C、C调A三个进程集体无响应。原因邮箱是串行队列handler阻塞整条队列形成环。解决handler里另开协程处理逻辑不等待返回。现象发消息报Actor不存在。原因实体正在迁移进程。解决框架自动重试5次业务侧捕获异常后重新发起请求。现象await之后继续用旧对象引用偶发崩溃。原因await期间Entity可能已被销毁。解决用EntityRef在await后重新获取仓库开发规则明确要求。现象锁泄漏或解锁失败。原因没用token闭环。解决LockWithToken取token解锁时带同一个lockToken调用UnLock。现象初始化脚本直接报错。原因中文目录或没装.NET 8。解决工程路径保持英文按运行指南补齐依赖。排完这些坑剩下的就是照着规范写业务代码了。回到开头那个换线场景你不再需要关心玩家在哪个进程对着Entity.Id发就行。想深挖原理读 Book/5.4Actor模型.md 和 Book/5.5Actor Location-ZH.md 两篇里面用中国邮政的比喻讲得很透写代码时以cn.etetet.actorlocation包里的12条测试用例为准绳。【免费下载链接】ETUnity3D Client And C# Server Framework项目地址: https://gitcode.com/GitHub_Trending/et/ET创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考