我正在制作一个应用程序作为一种学习体验,我遇到了两个主要问题:
1) 我有一个实施方案,对奥尔良来说可能是个好主意,也可能不是。。。我只是不知道。
2) 我正在寻找关于托管和部署的建议,基本上是:在哪里以及如何?这只是一次学习体验,所以小而便宜/免费很重要。
所以,首先。。。关于我正在制作的应用程序的一些信息:
- 这是一款基于移动gps的应用程序,带有MongoDB存储
- 现实世界被划分为不同且持久的区域,即gps位置块
- 当用户在给定区域中处于活动状态时,该用户对该区域中的其他所有用户都可见,并且他开始接收有关该区域的属性和该区域中其他活动用户的位置的更新
- 用户可以操作区域的属性
- 用户需要能够明确地加入和离开区域,但也需要在一段时间后离开
我有两个晶粒:UserGrain和RegionGrain
对于问题1)将Region作为一个晶粒来实现是个好主意吗?一些不同的示例支持此实现。但是,最佳实践手册表明,这不是一个好主意,因为这是一项长期的工作(该地区无限期地存在),而这种类型的粮食可能是一个瓶颈。但是我需要它表现得像"存在"样本中的"GameGrain",玩家加入和离开(明确或超时)。
对于问题2)
- 我有一个作为控制台应用程序实现的思洛存储器。我已经用amazon弹性豆茎部署了一个.net网络应用程序,但我不知道从哪里开始使用控制台应用程序。亚马逊是个不错的选择吗?我只是从最近的用法中默认了它
- 如果RegionGrain是个坏主意。。。一个好主意可能是什么样子的
- 如果RegionGrain是个好主意。。。有没有办法告诉奥尔良永远不要停用它?如果是这样的话,我应该使用定时器来满足超时要求,并使用存在和心跳来进行更新。。。正确的如果没有,我应该在维护和运行RegionGrain的地方托管另一个控制台应用程序吗
如果这仍然是一个实际问题:
关于问题1)-您的区域粒度对我来说似乎很好-这不是一个持续工作的粒度,而是您的区域注册表:当用户进入区域时,他会在区域粒度中注册(如果您想消除用户对此的责任,则由外部区域监视器注册)。这些地区可以无限期地存在,但这并不意味着它们是长期存在的工作。
长期运行的作业在奥尔良术语中是指在一个方法中做大量活动工作的作业(或者更糟的是,睡眠数秒或数分钟)-这将保存奥尔良线程池中的粒度和线程-因此这种做法被认为是不好的,但在这里并不适用。
关于托管-亚马逊和其他任何托管一样好,只要你知道如何在那里托管和运行你的工作。我们使用Azure进行托管-云服务非常容易上手,虚拟机成本通常与亚马逊持平(除了Azure免费试用期比亚马逊短3个月比1年,但资源更多)。
在问题2)上,定时器和其他-定时器不是持久的,因此如果禁用晶粒,它们将丢失,必须重新启动。提醒是恢复谷物的更好选择,而且谷物上有一种方法可以防止去激活——DelayDeactivation()
,而显式去激活的相反方法是DeactivateOnIdle()
。关于更新,我们发现Orleans Streams是一个非常好的概念,可以广播大规模更新(例如,从RegionGrain到所有订阅/注册用户),所以看看它,它可以解决订阅和广播方面的许多问题。
总的来说,我会以不同的方式构建它——让你的系统被动,而不是主动。例如:
- 用户进入区域-所以他只是在区域谷物上注册他的存在并订阅区域事件
- 该地区的任何变化都会被记录下来并推送到奥尔良流,这样所有订户都会收到该地区的活动
- 对其他玩家的任何更改都会发送到地区谷物(因此这将是我们的真相来源),然后重新广播给其他地区用户
在噪音很大的区域出现问题时(当系统中发生了太多变化,重新广播太大时,你可以让你所在的地区成为该地区流的另一个订户,这样每个玩家都会通过奥尔良流向其他人和地区本身进行广播。或者把你所在的区域变成一个广播控制器,只有在一段时间后,才会将所有变化批量广播到流中,每秒钟一次d或每5秒。。。
希望这能有所帮助。