【问题标题】:When and where is the best to initialize reliable collection?何时何地最好初始化可靠集合?
【发布时间】:2017-04-20 17:08:54
【问题描述】:

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

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

如果建议做这个初始化,什么时候做它合适的时间和地点? 最合理的位置是在 RunAsync 中的无限循环之前,但是如果在集合初始化之前调用通过远程处理调用的方法怎么办?在第一次远程调用中(当集合将被初始化时),性能是否会下降?

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

感谢您的回答!

【问题讨论】:

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


    【解决方案1】:

    我是否需要在第一次使用之前“初始化”集合(通过调用 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;
            }
        }
    

    【讨论】:

    • 感谢您的回答!对“保持引用与调用 GetOrAddAsync”的一点补充:场景:围绕可靠集合的包装类。类方法创建事务、存储/检索数据和提交事务。在包装器初始化/构造中获取对集合的引用就足够了,或者我应该在创建事务和使用集合之前在每个方法中调用 GetOrAddAsync 吗?您是否在每次 AddPost / RetrievePost 之前获取状态?
    • 在创建事务和使用集合之前,您应该在每个方法中调用GetOrAddAsync。好吧,当然你可以将它存储在一个变量中,但我不确定它是否会起作用,例如,当同时调用多个服务的方法时。可能它会起作用,但我不推荐这种方法。所以,是的,您需要在每个服务的方法调用上创建它。毕竟,为什么不呢?与其他操作相比,它非常便宜。我在每次调用 AddPost 时都会得到状态,就在方法本身内部。
    猜你喜欢
    • 2016-05-09
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多