Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何管理用户';使用akka的游戏状态_Scala_Akka - Fatal编程技术网

Scala 如何管理用户';使用akka的游戏状态

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 因此,在一场游戏中有许

我试图弄清楚如何使用akka管理用户的游戏状态

游戏状态将被持久化到mysql,这无法更改,因为我们有其他服务需要它

游戏中发生的任何事情都被视为“事件”

然后你我有一些人可以达到的“水平”。当您完成与之相关的所有“事件”时,即达到该级别

所以你有:

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做到这一点,并能够并行处理事情,或者这是场景不允许的吗?

让我们思考一下,如果没有演员,您将如何管理它。因此,简而言之,您有以下问题场景:

  • 两个(或多个)更新请求同时到达,两个都是 要修改相同的数据吗
  • 两个请求都读取一些稳定的数据 状态,然后以各自的方式对其进行更新,并保存到数据库中
  • 来自首先签入的请求的修改将丢失,更准确地说,将被后面的请求覆盖
  • 这是一个经典问题。它至少有两个经典解:

  • 悲观锁定:通常通过为事务应用隔离级别来实现
  • 这本书值得一读,并对两个世界进行了很好的比较

    当您使用Akka时,您很可能希望获得更好的并发性和偶尔的故障,这些都很容易恢复。它与Akka座右铭(代码)保持一致,让它崩溃< /代码> .< 因此,您需要执行以下步骤:

  • version
    列添加到表中。它可以是数字或字符串(带哈希)。数字是最简单的
  • 插入新记录时-初始化版本
  • 更新记录时-检查
    版本
    值未更改。因此,以下是您的更新策略:
  • 读取记录及其
    版本
  • 更新内存中的记录
  • 使用条件
    执行更新查询,其中rec_id=$id和version=$version
  • 如果更新记录计数为1,则表示您很好。如果0-抛出
    OptimisticLockException
    或类似的smth
  • 最后,
    Akka
    该做它的工作了:想出合适的监督策略(我会选择类似于
    的东西,在1秒内再试一次)。在actor的
    preRestart
    方法中,将更新消息返回到actor的邮箱(参见Akka文档中的章节)
    使用这种策略,即使两个请求试图一次更新同一条记录,其中一个请求也会失败并立即重新处理。

    看起来
    akka persistence
    可以解决这个问题yiu有mysql的例子吗?