1

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

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

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

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

感谢您的回答!

4

1 回答 1

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;
        }
    }
于 2016-12-06T09:07:34.803 回答