查询 Azure Service Fabric 中的参与者列表

Querying a list of Actors in Azure Service Fabric

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

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

  1. 查询字典。 GA之后,这好像是.
  2. 保持字典同步。也许通过 Pub/Sub or IActorEvents

另一种选择是在 Service Fabric 之外拥有一个持久存储,例如数据库。这感觉不对,因为它违背了使用 Service Fabric 的一些理想。如果我这样做了,我会假设与上述类似但使用无状态服务?

非常感谢。

如果您发现自己需要通过某些数据 属性 查询整个数据集,例如 User.Location,那么可靠集合是正确的答案。 Reliable Actors 不应该通过这种方式进行查询。

在您的情况下,用户可能只是 Reliable Dictionary 中的一行。

虽然标准建议肯定是作为 Vaclav 的回应,但如果查询是例外,那么 Actors 仍然是合适的。对我来说,它们是否合适是由访问它们的正常方式定义的,如果它是按键(大概是用户记录),那么 Actors 工作得很好。

可以迭代 Actors,但这是一项相当繁重的任务,所以就像我说的那样,只有在特殊情况下才是合适的。以下代码将构建一组 Actor 引用,然后您遍历该集合以获取 actors,然后可以在您构建的集合上使用 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:查询演员并不总是可取的,但如果需要可以实现。上面的代码将帮助您入门。

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

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

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