Azure service fabric 何时何地初始化可靠收集的最佳方法?
场景:statefull SF服务将其状态存储在几个可靠的集合中。可通过远程处理获得状态完整的SF 我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?它是否有助于降低对可靠收集的首次访问,还是不必执行此步骤 如果建议这样做,什么时候是合适的时间和地点? 最合理的位置就在RunAsync中的无止境循环之前,但如果通过远程处理调用的方法将在集合初始化之前调用呢?在第一次远程处理调用中(当集合要初始化时),性能是否会下降 最后一件事->处理可靠集合时,可以在类中保留对集合的引用(例如,在某些实例初始化期间,我将使用StateManager.GetOradAsync获取引用),并仅处理此引用,还是最好在每次调用集合之前调用StateManager.GetOradAsync 谢谢你的回答 我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync) 是的,但你不必这样做来“热身”收藏。如果确实需要检索某些数据或要存储某些内容,请调用该方法 如果在初始化集合之前调用通过远程处理调用的方法,该怎么办 这就是为什么每次调用该服务时都需要执行Azure service fabric 何时何地初始化可靠收集的最佳方法?,azure-service-fabric,stateful,service-fabric-stateful,Azure Service Fabric,Stateful,Service Fabric Stateful,场景:statefull SF服务将其状态存储在几个可靠的集合中。可通过远程处理获得状态完整的SF 我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?它是否有助于降低对可靠收集的首次访问,还是不必执行此步骤 如果建议这样做,什么时候是合适的时间和地点? 最合理的位置就在RunAsync中的无止境循环之前,但如果通过远程处理调用的方法将在集合初始化之前调用呢?在第一次远程处理调用中(当集合要初始化时),性能是否会下降 最后一件事->处理可靠集合
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;
}
}
public异步任务AddPost(Guid userId,PostId PostId)
{
尝试
{
var state=await StateManager.GetOrAddAsync(StateName);
使用(var tx=StateManager.CreateTransaction())
{
wait state.AddOrUpdateAsync(
德克萨斯州,
用户ID,
addValue:新列表{postId},
updateValueFactory:(usrId,oldPostsList)=>
{
oldPostsList.Insert(0,postId);
返回旧邮件列表;
}
);
wait tx.CommitAsync();
}
}
捕获(超时异常)
{
PostsLogger.Singleton.LogWarning(“添加后超时”);
投掷;
}
捕获(例外情况除外)
{
PostsLogger.Singleton.LogException(sb.ToString(),ex);
投掷;
}
}
我是否需要在首次使用之前“初始化”集合(通过调用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;
}
}
public异步任务AddPost(Guid userId,PostId PostId)
{
尝试
{
var state=await StateManager.GetOrAddAsync(StateName);
使用(var tx=StateManager.CreateTransaction())
{
wait state.AddOrUpdateAsync(
德克萨斯州,
用户ID,
addValue:新列表{postId},
updateValueFactory:(usrId,oldPostsList)=>
{
oldPostsList.Insert(0,postId);
返回旧邮件列表;
}
);
wait tx.CommitAsync();
}
}
捕获(超时异常)
{
PostsLogger.Singleton.LogWarning(“添加后超时”);
投掷;
}
捕获(例外情况除外)
{
PostsLogger.Singleton.LogException(sb.ToString(),ex);
投掷;
}
}
谢谢您的回答!对“hold reference vs.calling GetOrAddAsync”的一点补充:场景:围绕可靠集合的包装类。类方法创建事务、存储/检索数据和提交事务。在包装器初始化/构造中获取对集合的引用就足够了,或者在创建事务和使用集合之前,我应该在每个方法中调用GetOrAddAsync吗?您是否在每个AddPost/RetrievePost之前获取状态?在创建事务和处理集合之前,您应该在每个方法中调用GetOrAddAsync
。当然,您可以将其存储在变量中,但我不确定它是否有效,例如,当同时调用多个服务的方法时。也许它会起作用,但我不推荐这种方法。所以,是的,您需要在每个服务的方法调用上创建它。毕竟,为什么不呢?与其他操作相比,它非常便宜。我在每次调用AddPost时都会得到状态,就在方法本身内部。谢谢您的回答!对“hold reference vs.calling GetOrAddAsync”的一点补充:场景:围绕可靠集合的包装类。类方法创建事务、存储/检索数据和提交事务。在包装器initia中获取对集合的引用就足够了