2016-01-24 96 views
2

在我的应用程序中,用户可以在地图上发布事件。该应用程序的入口点是一个无状态的Web API服务。为了在内部代表用户,我想要一个用户服务。我应该何时使用Reliable Stateful Actors以及何时可靠的有状态服务来存储每个用户的配置文件数据和发布的事件?服务结构服务与用户表示的服务结构参与者

当客户端在前端创建新用户时,参与者或服务应在内部创建新用户。每次用户登录时,web api服务都应将所有用户交互转发给用户的内部表示(Actor或Service)。例如。用户发布新事件,Web API服务找到用户并将发布的事件转发给他。由于发布的事件是公开的,我还希望拥有可靠的有状态事件服务。在用户存储发布的事件之后,用户服务应将事件转发给事件服务。

例如:

Client/User --> WebApiService --> UserService/UserActor --> EventService 

当用户希望看到地图上所有的公共事件应该是这样的:

Client/User <-- WebApiService <-- EventService 

由于该事件具有地理参考,我想根据地理编码或类似的东西对EventService进行分区。

对于这样的应用程序,我应该选择哪种编程模型(actor和/或service)?为什么?

回答

2

无论哪种方式可以适用于这种情况,但它听起来并不像你需要这里的Actor模式的功能,所以我建议先从可靠服务开始并将用户存储在Reliable Dictionary中。请记住,参与者是在可靠服务之上实施的特定模式,因此在某些方面,您将被限制在该模式的限制之下,如果不仔细计划,稍后可能会出现问题。例如,对一组actor执行查询并不能很好地工作,所以如果你稍后决定需要在你的用户基础上运行一个查询,那么如果你使用一个Reliable易于查询的词典。

对于您的活动服务,是的,您当然可以通过地理坐标进行分区。我过去做过的一种方法是将地理坐标转换为quadkeys,这是一种方便的方式来表示二维空间数据的一维密钥。但是,请记住,您可能会获得本地热点,这可能会导致分区中出现一些集群(大部分用户是以大城市为中心的?如果是这样,这些分区的数据将比其他分区更多)。

+0

这个例子中使用actor的原因是什么?我阅读了您的文档中的当地热点。但对于地理坐标给出的例子。我怎样才能避免这些热点?我知道以后我不能更改分区数量,但是以后可以设置新的分区名称吗? – CPA

+0

避免热点的一种方法是使用良好的哈希算法来生成密钥 – cdaq