我正在构建一个使用Akka持久性的CQRS驱动系统作为辅助项目和学习练习 . 我正在寻找一些关于我如何建模的帮助 .

总之,我有一个游戏 . 纯粹的游戏机制是一个FSM(我实际上是使用PersistentFSM对此进行建模)并且我已经读取了这个持久化actor的视图,前端客户端API查询确定在客户端呈现什么 . 这很好用 .

游戏是基于单词的游戏 . 简而言之,你可以想象游戏中的每个玩家提交一些句子,然后确定这些句子的分数 . 根据分数,发行许多硬币(游戏内币) .

因此,客户端可以发送命令给游戏 . 客户可以提交一个单词的句子 . 现在我正在实现这个作为客户端请求处理程序(我不知道这些在CQRS世界中可以与哪些相关,一个短暂的传奇/ PM?)获取后备FSM命令处理程序的actor并发送例如Commands.SubmitSentence(...) . 然后,该命令处理程序处理该命令,验证该句子,并生成一些事件(SentenceSubmitted,作为一个明显的事件) . 我不完全确定是否应该从我的API级别直接向PersistentFSM发送命令,因此也欢迎输入 .

我的主要问题是如何处理外围影响 . 例如,一旦每个玩家提交了句子,我们就需要生成积分和硬币 . 点数仅用于该游戏的视图中,但是如果玩家想要花钱,则需要将硬币保留在系统中的其他位置 . 我这样看着它:

  • 游戏根据句子/其他游戏因素计算得分和硬币数量 . 这会生成一个事件"GameScoreCalculated"

  • 一些"listener"例如"CoinListener"订阅了这个计算事件(如果监听器是一个单例,从Akka Persistence的说法,该事件有一些标签,它是's subscribed to). I feel like, from all I'已经读过,这是一种ProcessManager . 我对Akka实现是否有点不清楚在某种意义上,是每个玩家一个,或一个单身,或分片 .

  • CoinListener在确保它没有收到同一游戏的多个事件后,会生成一些命令来创建实际的硬币(CreateCoin(playerId,...))并自行触发它们

  • CoinListener对那些CreateCoins作出反应以保留一些CoinCreated事件

稍后,当我构建配置文件和购买系统时,应用程序的这些区域将使用CoinCreated事件来聚合玩家实际拥有的硬币数量 .

这甚至有意义吗?

谢谢Rik