Replies: 15 comments 16 replies
-
离线 就 拉起 B 创建个 agent |
Beta Was this translation helpful? Give feedback.
-
这样新启一个agent,如果agent逻辑比较多,可能需要一定时间,比如1s 不知道陌陌争霸当时是怎么做的?比如去攻打别人的城 |
Beta Was this translation helpful? Give feedback.
-
一般拉起是毫秒级。但还是要好好设计:
|
Beta Was this translation helpful? Give feedback.
-
请教一下,可不可以用直接修改B玩家的数据库数据的做法? |
Beta Was this translation helpful? Give feedback.
-
我也提个方案吧,可以用消息队列的方式,每个玩家维护一个离线消息队列,玩家上线的时候去处理消息队列里的消息。不管玩家在不在线都推消息到消息队列里,玩家在线的时候定时消费消息队列里的消息。 |
Beta Was this translation helpful? Give feedback.
-
我认为这个需求本质上就是做一个带特定事务的内存数据库服务。 你可以把“菜” 这个东西从玩家数据中剥离出来,玩家有多少“菜”以及“菜”的状态在集中管理的数据集里,不在玩家各自的数据里。玩家数据中只做一个 copy 用于显示。然后做一个(组)服务用于管理所有玩家的“菜”。这些“菜”的数据和玩家在不在线无关。即,玩家在展示“菜”的时候,再向服务提请求获得状态。它更类似数据库的做法:冷数据放在磁盘,热数据放在内存,服务处理原子事务。 至于是不是一定要用通用数据库处理事务,我认为是可选的。可能自己实现服务的逻辑更简单。 最后设计货币的问题。货币是跨业务的应用,不能绑定在“菜”上面。我觉得可以为“菜”这些系统设计一个子账户放这个玩法的货币,并且允许它为负数。这个设定未必给玩家看到。可以在交易结束后的环节和玩家账户中的货币做合并。也就是说,玩家玩到“菜”的玩法需要货币的时候,把身上的货币充进了“菜”这个系统。系统保证自身的事务都是原子的。如果不出错,货币(子账户)结余都是 0 。如果出错,再和玩家身上的货币合并的时候,多退少补。 |
Beta Was this translation helpful? Give feedback.
-
他应该只是举个例偷菜,估计还有更多互相访问的需求。 |
Beta Was this translation helpful? Give feedback.
-
需要互相访问的数据单独放在一个服务里。只有这一个服务来修改这些数据,就不会存在互相修改。
…On Mon, May 24, 2021 at 11:45 AM Bruce ***@***.***> wrote:
他应该只是举个例偷菜,估计还有更多互相访问的需求。
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#1407 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAWLMAS42PWJA34NPAX5AADTPHDULANCNFSM45MLNURA>
.
|
Beta Was this translation helpful? Give feedback.
-
菜又不在玩家身上,菜单独放个服务管理所有的菜(可以开多个服务),只是菜属于谁,给他打个标记。。。 |
Beta Was this translation helpful? Give feedback.
-
刚好手上有一个类似于攻打查看别人的城的需求, 同时攻打下来双方的货币以及攻击方的部队的损失和防守方防御建筑的损失都要计算, 同时还涉及了一些的成就和日常任务以及排行榜等, 所以过来看看大家的做法. 这几种做法我都思考了下, 最终我选的是拉起玩家再操作. 选这个方案的原因是: 1.我们的服务器是1个游戏进程只有一个agent, 整个进程的所有的玩家都在一个lua服务里面, 所以对很多的离线玩家操作, 就只要载入玩家的数据就可以, 不像1个agent1个玩家这种方案, 每个agent都有代码或配置导致的额外开销. 像之前有个讨论讲sharetable的时间开销.. 2.因为一些玩法涉及多个模块, 其它的方案要做一些额外的处理, 而拉起来操作会比较简单, 仍旧使用玩家自已的功能模块, 也不用担心数据的一致性问题. |
Beta Was this translation helpful? Give feedback.
-
其实这个问题的核心在于抽离公共数据与个人数据吧, |
Beta Was this translation helpful? Give feedback.
-
例如一些好友的数据,对好友进行赠送功能,其实上线不上线没关系,直接操作好友的数据(缓存/或者数据库),读取频繁的就载入缓存。 |
Beta Was this translation helpful? Give feedback.
-
路过。。请关注 zhugedb 。完美解决这种分布式系统下的事务性以及离线数据的问题。 https://github.com/focus-creative-games/zhugedb |
Beta Was this translation helpful? Give feedback.
-
1. 把所有的玩家全部都放在一个agent里,不太好,这里失去了横向扩展的可能。
2.
一个player一个agent,拉起agent的问题在于,要解决,这个时候如果这个玩家登录了,你需要把这个offline-player-agent
转移成一个online-player-agent。处理好这点其他的都ok了。
给每个player agent一个lifetime,超过一定时间没有消息过来,把自己杀掉就可以了。
已经在成熟上线的SLG项目跑了几年了,没有什么问题。
walon ***@***.***> 于2022年4月10日周日 15:38写道:
… 路过。。请关注 zhugedb 。完美解决这种分布式系统下的事务性以及离线数据的问题。
https://github.com/focus-creative-games/zhugedb
—
Reply to this email directly, view it on GitHub
<#1407 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ABDOENY5AYT2HELY6ZSI2OTVEKAOZANCNFSM45MLNURA>
.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
Beta Was this translation helpful? Give feedback.
-
A 和 B 两个玩家都是独立的 agent,各自维护各自的数据
如果 A 要去修改 B 的数据,比如偷了 B 的一棵菜,或者修改 B 的货币
正常应该是 A 发消息给 B 的agent,执行偷菜的操作
但如果 B 不在线,B 的agent不存在呢? 需要怎么做?
Beta Was this translation helpful? Give feedback.
All reactions