事务写入
在本教程中,我们将介绍如何对统计信息执行事务写入。 根据用于存储统计信息的过程,开发人员可能会遇到可能导致作重复的情况,尤其是使用 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
:此参数对应于创建统计信息定义时设置的统计信息名称。
-
明确这些概念后,现在可以将数据添加到统计信息,并避免请求出现任何重复。