Scala 如何管理用户';使用akka的游戏状态
我试图弄清楚如何使用akka管理用户的游戏状态 游戏状态将被持久化到mysql,这无法更改,因为我们有其他服务需要它 游戏中发生的任何事情都被视为“事件” 然后你我有一些人可以达到的“水平”。当您完成与之相关的所有“事件”时,即达到该级别 所以你有:Scala 如何管理用户';使用akka的游戏状态,scala,akka,Scala,Akka,我试图弄清楚如何使用akka管理用户的游戏状态 游戏状态将被持久化到mysql,这无法更改,因为我们有其他服务需要它 游戏中发生的任何事情都被视为“事件” 然后你我有一些人可以达到的“水平”。当您完成与之相关的所有“事件”时,即达到该级别 所以你有: Level - event1 e.g. reach a point in the game - event2 e.g. pickup a sword - event3 e.g. defeat a monster 因此,在一场游戏中有许
Level
- event1 e.g. reach a point in the game
- event2 e.g. pickup a sword
- event3 e.g. defeat a monster
因此,在一场游戏中有许多关卡,100个与关卡相关的事件
因此,所有“事件”都通过HTTP发送到我的后端,我将事件保存在数据库中
然后我必须在内存中加载用户游戏配置文件,然后重新计算由于发生了新事件而达到的级别。
注意:这个计算不能在数据库级别进行,因为我在这里写的计算要复杂一点。
我看到的问题是,如果我使用akka,我不能让多个参与者为同一个用户处理事件,因为数据可能会过时
为了清楚起见,当一个新的事件到来时,我必须在内存中加载游戏配置文件,循环遍历关卡,看看是否有关卡已经实现,如果已经实现,则更新数据库
e.g. update levels set achieved=true where level_id = 123 and user_id=234
e、 g.actor1加载配置文件(此用户的所有级别和事件),然后处理刚到达收件箱的新事件。
同时,actor2加载概要文件(与actor1相同),然后处理新事件。当它将更改持久化到mysql时,数据将不在sych中
如果我使用线程,我将不得不在游戏配置文件计算期间锁定并持久化到db
我如何使用Akka做到这一点,并能够并行处理事情,或者这是场景不允许的吗?让我们思考一下,如果没有演员,您将如何管理它。因此,简而言之,您有以下问题场景:
version
列添加到表中。它可以是数字或字符串(带哈希)。数字是最简单的版本
值未更改。因此,以下是您的更新策略:
版本
执行更新查询,其中rec_id=$id和version=$version
OptimisticLockException
或类似的smthAkka
该做它的工作了:想出合适的监督策略(我会选择类似于的东西,在1秒内再试一次)。在actor的preRestart
方法中,将更新消息返回到actor的邮箱(参见Akka文档中的章节)李>
使用这种策略,即使两个请求试图一次更新同一条记录,其中一个请求也会失败并立即重新处理。看起来akka persistence
可以解决这个问题yiu有mysql的例子吗?