Azure service fabric 何时何地初始化可靠收集的最佳方法?

Azure service fabric 何时何地初始化可靠收集的最佳方法?,azure-service-fabric,stateful,service-fabric-stateful,Azure Service Fabric,Stateful,Service Fabric Stateful,场景:statefull SF服务将其状态存储在几个可靠的集合中。可通过远程处理获得状态完整的SF 我是否需要在首次使用之前“初始化”集合(通过调用StateManager.GetOrAddAsync)?它是否有助于降低对可靠收集的首次访问,还是不必执行此步骤 如果建议这样做,什么时候是合适的时间和地点? 最合理的位置就在RunAsync中的无止境循环之前,但如果通过远程处理调用的方法将在集合初始化之前调用呢?在第一次远程处理调用中(当集合要初始化时),性能是否会下降 最后一件事->处理可靠集合

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

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

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

最后一件事->处理可靠集合时,可以在类中保留对集合的引用(例如,在某些实例初始化期间,我将使用StateManager.GetOradAsync获取引用),并仅处理此引用,还是最好在每次调用集合之前调用StateManager.GetOradAsync

谢谢你的回答

我是否需要在首次使用之前“初始化”集合(通过调用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);
投掷;
}
}
我是否需要在首次使用之前“初始化”集合(通过调用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中获取对集合的引用就足够了