场景:statefull SF服务会将其状态存储在多个可靠的集合中。 Statefull SF可通过远程处理获得。
我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?它是否有助于降低对可靠收集的首次访问,或者没有必要执行此步骤?
如果建议执行此init,何时是正确的时间和地点? 最合理的地方是在RunAsync中无限循环之前,但是如果在初始化集合之前调用通过远程处理调用的方法会怎么样?第一次远程通话中的性能是否会有任何恶化(当集合初始化时)?
最后一件事 - >使用可靠的集合时,可以在类中保持对集合的引用(例如,在某些实例启动期间,我将通过使用StateManager.GetOrAddAsync获取引用)并仅使用此引用或最好在每次调用之前调用StateManager.GetOrAddAsync集合?
感谢您的回答!
答案 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;
}
}