Transaktionsschreibvorgänge
In diesem Tutorial erfahren Sie, wie Sie einen Transaktionsschreibvorgang in eine Statistik durchführen. Abhängig vom Prozess, der zum Speichern von Statistiken verwendet wird, können Entwickler auf Szenarien stoßen, die zur Duplizierung eines Vorgangs führen können, insbesondere bei der SUM-Aggregation. Um diese komplexen Szenarien zu beheben, haben wir das Transaktionsschreibfeature hinzugefügt.
Wir beginnen mit einem Beispiel für ein Multiplayer-Spiel, bei dem viele Spiele gleichzeitig gespielt werden. Dieses Spiel speichert eine große Anzahl von Statistiken und anderen Telemetriewerten für jede Übereinstimmung. Um das Spielerlebnis zu vermeiden, hat das Studio beschlossen, die Statistiken alle 10 Minuten anstelle von Echtzeit zu pushen.
Dieser Ansatz sorgt für eine nahtlose Erfahrung für Spieler, die von einem Spiel zum anderen springen. Es bringt jedoch neue technische Herausforderungen mit sich. Wir benötigen jetzt eine Warteschlange, um Anforderungen alle 10 Minuten auszuführen. Aber was geschieht, wenn wir die Ereignisse in der Warteschlange aus einem bestimmten Grund wiedergeben möchten. Dann benötigen wir möglicherweise eine Herausforderung, insbesondere wenn wir Statistiken mit SUM-Aggregation haben, da wir doppelte Zählungen vermeiden müssen.
In diesem Zusammenhang werden wir zeigen, wie wir dieses spezielle Problem lösen können.
Erstellen einer Statistikdefinition
Zunächst erstellen wir eine Statistikdefinition. Auf dieser Ebene müssen wir keine spezielle Konfiguration für die Transaktionsschreibvorgänge hinzufügen.
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);
}
Hinzufügen von Daten zu einer Statistik
In unserem Beispiel fügen wir der zuvor definierten Statistik Daten hinzu. Der Hauptunterschied zwischen einer normalen Anforderung und dieser Anforderung ist der spezielle TransactionId
Parameter. Dieser Parameter dient als Bezeichner für die ausgeführte Anforderung. Jedes Mal, wenn eine neue Anforderung eingeht, vergleicht das System die neuen Transaktions-IDs mit den Bezeichnern, die bereits verarbeitet wurden. Wenn eine Übereinstimmung gefunden wird, wird die Anforderung nicht ausgeführt.
Ein wichtiger Aspekt, der berücksichtigt werden sollte, ist, dass dieses Transaktionsverhalten eine Beziehung zwischen und TransactionId
der ausgeführten Anforderung herstellt, nicht mit den einzelnen Statistiken innerhalb dieser Anforderung.
Es gibt keine Zuordnung für jede einzelne Statistik. die Zuordnung gilt für die gesamte Anforderung. Wenn dieses Feature verwendet wird, haben wir auch eine andere Verbrauchseinheit für die Nachverfolgung dieser Art von Anforderungen. Weitere Informationen finden Sie hier: Statistikzähler.
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);
}
Lassen Sie uns nun einige wichtige Elemente dieses Beispiels erläutern:
-
Entity
: Dieser Parameter entspricht der Entität, von der aus die Aktualisierung des stat-Objekts durchgeführt werden soll. -
TransactionId
: Dieser Parameter entspricht einer Zeichenfolge, die einen eindeutigen Bezeichner für die Anforderung darstellt. -
Statistics
: Dieser Parameter entspricht dem tatsächlichen Satz von Statistiken einer Entität. -
StatisticUpdate
: Dieser Parameter entspricht den Statistikwerten, die hinzugefügt werden sollen.-
Scores
: Dieser Parameter entspricht der Liste der Bewertungen, die Sie einer Entität hinzufügen können. Denken Sie daran, dass Statistiken mehr als eine Spalte enthalten können. Sie können diese Konzepte hier ausführlich überprüfen: Mehr mit Statistiken tun -
Name
: Dieser Parameter entspricht dem Statistiknamen, der beim Erstellen der Statistikdefinition festgelegt wurde.
-
Wenn diese Konzepte klar sind, sind Sie jetzt bereit, Daten zu Ihrer Statistik hinzuzufügen und Jegliche Duplizierung ihrer Anforderungen zu vermeiden.