查询Azure Service Fabric

时间:2016-05-22 20:27:20

标签: azure-service-fabric

我目前为系统中的每个用户都有一个ReliableActor。这个actor被恰当地命名为User,并且为了这个问题有一个Location属性。按位置查询用户的推荐方法是什么?

我目前的想法是创建一个包含ReliableDictionary的ReliableService。字典中的数据将是用户数据的投影。如果我这样做,那么我需要:

  1. 查询字典。 GA之后,这似乎是recommended approach
  2. 保持字典同步。也许是通过Pub/SubIActorEvents
  3. 另一种替代方法是在Service Fabric外部拥有持久性存储,例如数据库。这感觉不对,因为它违背了使用Service Fabric的一些理想。如果我这样做,我会假设类似于上面的东西,但使用无状态服务?

    非常感谢。

3 个答案:

答案 0 :(得分:5)

我亲自探索使用Actors作为我的实体的主要数据存储(即:真实来源)。随着Actors的添加,更新或删除,我使用MassTransit发布事件。然后我让Reliable Statefull Services订阅了这些活动。服务接收事件并更新其内部的IReliableDictionary。然后可以查询服务以查找客户端所需的实体。每项服务仅保留执行查询所需的实体数据。

我也在探索使用EventStore来发布事件。这样,如果将来我决定需要以新的方式查询实体,我可以创建一个新服务并重播所有事件。

这些Pub / Sub方法确实意味着查询服务最终是一致的,但在分布式系统中,这似乎是常态。

答案 1 :(得分:3)

虽然标准建议肯定是Vaclav的回应,但如果查询是例外,那么Actors仍然是合适的。对我而言,无论它们是否合适都是通过正常的访问方式来定义的,如果它是按键(可能是用户记录),那么Actors运行良好。

可以迭代Actors,但这是一项非常繁重的任务,所以就像我说的那样,只有在特殊情况下才合适。下面的代码将构建一组Actor引用,然后迭代这个集合来获取actor,然后可以在你构建的集合上使用Linq或类似的东西。

ContinuationToken continuationToken = null;
var actorServiceProxy = ActorServiceProxy.Create("fabric:/MyActorApp/MyActorService", partitionKey);
var queriedActorCount = 0;
do
{
    var queryResult = actorServiceProxy.GetActorsAsync(continuationToken, cancellationToken).GetAwaiter().GetResult();
    queriedActorCount += queryResult.Items.Count();
   continuationToken = queryResult.ContinuationToken;
} while (continuationToken != null);

TLDR:查询actor并不总是可取的,但如果需要可以实现。上面的代码可以帮助您入门。

答案 2 :(得分:1)

如果您发现自己需要通过某些数据属性(如User.Location)查询数据集,那么Reliable Collections就是正确的答案。可靠的演员不应该通过这种方式被查询。

在您的情况下,用户可能只是可靠字典中的一行。