1

我正在制作一个应用程序作为一种学习体验,我遇到了两个主要问题:

1)我有一个对奥尔良来说可能不是一个好主意的实现......我只是不知道。

2)我正在寻找有关托管和部署的建议,基本上:在哪里以及如何?这只是一种学习体验,所以小而便宜/免费很重要。

所以,开始......关于我正在制作的应用程序的一些信息:

  • 这是一个基于 MongoDB 存储的移动 gps 应用程序。
  • 现实世界被划分为不同且持久的区域、gps 位置块。
  • 当用户在给定区域中处于活动状态时,该区域中的所有其他用户都可以看到他,并且他开始接收有关该区域的属性和该区域中其他活动用户的位置的更新。
  • 用户可以操作区域的属性。
  • 用户需要能够明确地加入和离开区域,但也需要在超时后离开。

我有两个谷物:UserGrainRegionGrain

对于问题 1)将 Region 作为谷物实施是不是一个好主意?一些不同的示例支持此实现。但是,最佳实践手册表明这不是一个好主意,因为它是一项长期运行的工作(区域无限期持续存在),并且这种类型的颗粒可能是一个瓶颈。但是......我需要它像“Presence”样本中的“GameGrain”一样,玩家加入和离开(明确或超时)。

对于问题 2)

  • 我有一个作为控制台应用程序实现的筒仓。我使用 amazon elastic beanstalk 部署了一个 .net web 应用程序,但我不知道从哪里开始使用控制台应用程序。亚马逊是一个不错的选择吗?我只是从最近的使用中默认它。
  • 如果 RegionGrain 是一个坏主意……一个好主意会是什么样子?
  • 如果 RegionGrain 是个好主意……有没有办法告诉奥尔良永远不要停用它?如果是这样,我应该使用 Timers 来满足超时要求,以及更新的存在和心跳......对吗?如果不是,我是否应该在某个维护和运行 RegionGrain(s) 的地方托管另一个控制台应用程序?
4

1 回答 1

3

如果这仍然是一个实际问题:

关于问题 1) -您的区域粒度对我来说似乎很好-这不是一个持续工作的粒度,而是您的区域注册表:当用户进入该区域时-他在区域粒度中注册(或者如果您愿意,则由外部区域监视器注册消除用户对此的责任)。这些区域可以无限期地存在,但这并不意味着它们是长期运行的工作。

奥尔良术语中的长期运行工作是在单一方法中进行大量活动的工作(或更糟 - 休眠几秒钟或几分钟) - 这将保留奥尔良线程池中的谷物和线程 - 所以这种做法被认为是不好的但它在这里并不适用。

托管- 只要您知道如何在那里托管和运行您的工作,亚马逊就与任何其他托管一样好。我们使用 Azure 进行托管 - 云服务非常容易上手,VM 成本通常与亚马逊相当(除了 Azure 免费试用期比亚马逊短 3 个月 vs 1 年,但资源更多)。

在问题 2) 中,计时器和其他- 计时器不是持久的,因此如果颗粒被停用 - 它们会丢失并且必须重新启动。提醒是恢复谷物的更好选择,并且谷物上有一种方法可以让您防止停用 - DelayDeactivation(),与显式停用相反的是DeactivateOnIdle(). 关于更新 - 我们发现 Orleans Streams 是广播大规模更新(例如从 RegionGrain 到所有订阅\注册用户)的非常好的概念,所以看看它,它可能会解决订阅和广播的许多问题。

一般来说,我会构建这个有点不同 - 让你的系统反应而不是脉冲\主动。例如:

  • 用户进入区域 - 所以他只是在区域粒度上注册他的存在并订阅区域事件。
  • 对区域的任何更改都会被记录并推送到奥尔良流 - 因此所有订阅者都将收到区域事件。
  • 对其他玩家的任何更改 - 向区域谷物发送消息(因此它将成为我们的真实来源),然后重新广播给其他区域订阅者。

如果出现非常嘈杂的地区的问题(当系统中发生太多变化并且重新广播太大时 - 您可以使您的地区只是该地区流的另一个订阅者 - 因此每个玩家都将通过奥尔良流向彼此广播和区域本身。或者使您的区域成为一个广播控制器,它只会在一段时间后将一批中的所有更改广播到流中 - 每秒或每 5 秒......

希望这可以帮助。

于 2016-06-25T06:45:50.173 回答