事务写入

在本教程中,我们将介绍如何对统计信息执行事务写入。 根据用于存储统计信息的过程,开发人员可能会遇到可能导致作重复的情况,尤其是使用 SUM 聚合。 为了解决这些复杂的方案,我们添加了事务写入功能。

我们将从一个示例开始,该示例涉及同时玩多个比赛的多人游戏。 此游戏为每个匹配存储大量的统计信息和其他遥测值。 为了避免中断玩家体验,工作室决定每 10 分钟推送一次统计信息,而不是实时推送一次。

此方法可确保玩家从一场比赛跳到另一场比赛的无缝体验。 但是,它引入了新的技术挑战。 现在需要一个队列来每 10 分钟执行一次请求。 但是,如果出于任何给定原因而重播队列中的事件,会发生什么情况。 然后,我们可能需要一个挑战,特别是如果我们具有 SUM 聚合的统计信息,因为我们需要避免重复计数。

考虑到这一背景,我们将演示如何解决此特定问题。

创建统计信息定义

我们将首先创建一个统计定义,在此级别,我们不需要为事务写入添加任何特殊配置。

public static async Task CreateStatisticDefinitionAsync(PlayFabAuthenticationContext context, string statName)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateStatisticDefinitionRequest statDefinitionRequest = new CreateStatisticDefinitionRequest()
    {
        Name = statName,
        AuthenticationContext = context,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<StatisticColumn>()
        {
            new StatisticColumn()
            {
                Name = "Eliminations",
                AggregationMethod = StatisticAggregationMethod.Sum,
            },
             new StatisticColumn()
            {
                Name = "Caliber",
                AggregationMethod = StatisticAggregationMethod.Min,
            }
        },
    };
    
    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createStatDefResult = await statsAPI.CreateStatisticDefinitionAsync(statDefinitionRequest);
}

将数据添加到统计信息

继续我们的示例,我们将将数据添加到以前定义的统计信息。 正常请求和此请求之间的主要区别是特殊 TransactionId 参数。 此参数用作正在执行的请求的标识符。 每当新请求到达时,系统会将新事务 ID 与已处理的标识符进行比较。 如果找到匹配项,则不会执行请求。

要考虑的一个关键方面是,此事务行为在和正在执行的请求之间建立关系,而不是与该请求中的单个统计信息建立 TransactionId 关系。 没有每个统计信息的映射;映射适用于整个请求。 此外,使用此功能时,我们使用不同的计量器来跟踪此类请求,请在此处了解详细信息: 统计信息计量

public static async Task UpdateStatisticForPlayer(PlayFabAuthenticationContext context, string statName, string entityId, int eliminationScore, int caliberScore)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateStatisticsRequest updateStatRequest = new UpdateStatisticsRequest()
    {
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        AuthenticationContext = context,
        TransactionId = "YOUR_OWN_IDENTIFIER"
        Statistics = new List<PlayFab.LeaderboardsModels.StatisticUpdate>() 
        {
            new PlayFab.LeaderboardsModels.StatisticUpdate() 
            {
                Name = statName,
                Scores = new List<string> { eliminationScore.ToString(), caliberScore.ToString()},
            }
        }
    };

    PlayFabResult<UpdateStatisticsResponse> updateResult = await statsAPI.UpdateStatisticsAsync(updateStatRequest);
}

现在,让我们解释一下此示例的一些关键元素:

  • Entity:此参数对应于要从中更新统计信息的实体。
  • TransactionId:此参数对应于表示请求的唯一标识符的字符串。
  • Statistics:此参数对应于实体的实际统计信息集。
  • StatisticUpdate:此参数对应于要添加的统计信息值。
    • Scores:此参数对应于可添加到一个实体的分数列表。 请记住,统计信息可以包含多个列。 可在此处深入检查以下概念:使用统计信息执行更多作
    • Name:此参数对应于创建统计信息定义时设置的统计信息名称。

明确这些概念后,现在可以将数据添加到统计信息,并避免请求出现任何重复。

另请参阅