什么时候和哪里最好初始化可靠的集合?

时间:2016-12-06 06:18:02

标签: azure-service-fabric stateful service-fabric-stateful

场景:statefull SF服务会将其状态存储在多个可靠的集合中。 Statefull SF可通过远程处理获得。

我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?它是否有助于降低对可靠收集的首次访问,或者没有必要执行此步骤?

如果建议执行此init,何时是正确的时间和地点? 最合理的地方是在RunAsync中无限循环之前,但是如果在初始化集合之前调用通过远程处理调用的方法会怎么样?第一次远程通话中的性能是否会有任何恶化(当集合初始化时)?

最后一件事 - >使用可靠的集合时,可以在类中保持对集合的引用(例如,在某些实例启动期间,我将通过使用StateManager.GetOrAddAsync获取引用)并仅使用此引用或最好在每次调用之前调用StateManager.GetOrAddAsync集合?

感谢您的回答!

1 个答案:

答案 0 :(得分:0)

  

我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?

是的,但你不必那样做“热身”收藏。如果您确实需要检索某些数据或想要存储某些数据,请调用该方法。

  

如果在初始化集合之前调用通过远程处理调用的方法会怎么样?

这就是为什么你需要在每次调用服务时都StateManager.GetOrAddAsync

  

第一次远程通话中的表现是否会有任何恶化

是。但这将是不明显的。

  

使用可靠的集合时,可以在类

中保留对集合的引用

您可以在方法调用中的变量中保存对集合的引用。这是一个例子:

    public async Task AddPost(Guid userId, PostId postId)
    {
        try
        {
            var state = await StateManager.GetOrAddAsync<IReliableDictionary<Guid, List<PostId>>>(StateName);

            using (var tx = StateManager.CreateTransaction())
            {
                await state.AddOrUpdateAsync(
                    tx,
                    userId,
                    addValue: new List<PostId> {postId},
                    updateValueFactory: (usrId, oldPostsList) =>
                    {
                        oldPostsList.Insert(0, postId);
                        return oldPostsList;
                    }
                );

                await tx.CommitAsync();
            }
        }
        catch (TimeoutException)
        {
            PostsLogger.Singleton.LogWarning("Add post timeout");
            throw;
        }
        catch (Exception ex)
        {
            PostsLogger.Singleton.LogException(sb.ToString(), ex);
            throw;
        }
    }