事件管道
事件管道是 PlayFab Services SDK 的一部分,其主要目的是允许游戏开发人员发送要存储在 PlayFab Insights 中的事件。它允许开发人员指定批处理大小、发送频率以及适当遥测解决方案的其他方面。 它有助于减轻游戏开发人员的负担并代表他们处理所有这些方面。它支持可配置的事件管道。一个游戏可以包含一个或多个此类管道,每个管道都可以使用自己的属性进行配置。 让我们来看看管道的一些基本概念。管道类型
管道类型与管道发出的事件类型直接相关。开发人员可以实例化两种不同类型的管道:- 遥测事件管道:只能发送遥测事件,并使用 Write Telemetry Events REST API。
- PlayStream 事件管道:只能发送 PlayStream 事件,并使用 Write Events REST API。
身份验证类型
管道创建的另一个重要部分是身份验证类型。PlayFab 事件支持两种身份验证机制——实体身份验证和遥测密钥身份验证。 当游戏开发人员想要将他们的事件链接到特定实体以便进一步聚合或分析时,可使用实体身份验证。例如,游戏开发人员可以记录与玩家操作相关的事件,以进一步分析游戏玩家的行为,以便进行分段。 当游戏开发人员想要记录不一定需要链接到实体的事件时,可使用遥测密钥身份验证。例如,在玩家登录之前,游戏可以开始发送与性能或希望收集以供进一步分析的特定指标相关的事件。这可以在无需通过常规实体身份验证过程的情况下完成。 支持的身份验证类型/事件类型组合实体身份验证
此身份验证类型是常规且最常见的 PlayFab 身份验证方法。它与特定实体紧密相关,并要求你调用相应的 PlayFab 登录 API 才能获得实体令牌以用于任何后续调用。以下列表表示可用于实体身份验证的不同类型的实体。- namespace:namespace 实体是指工作室内所有游戏的全部全局信息。
- title:title 实体是指该游戏的所有全局信息。
- master_player_account:master_player_account 是工作室内所有游戏共享的玩家实体。
- title_player_account:对于大多数开发人员,title_player_account 以最传统的方式表示玩家。
- character:character 实体是 title_player_account 的子实体。
- group:group 实体是其他实体的容器。它目前仅限于玩家和角色。
遥测密钥身份验证
遥测密钥身份验证不需要实体令牌,因此它不与任何特定实体绑定。 如果使用遥测密钥身份验证,则在管道创建期间需要 PFEventPipelineTelemetryKeyConfig 结构体。此结构体有两个主要部分:- 一个遥测密钥,由通过 PlayFab Game Manager 创建和管理的字符串组成。
- 一个 PFServiceConfigHandle,让 SDK 知道哪个服务配置是用于上传事件的正确配置。服务配置句柄是在 SDK 初始化期间通过调用 PFServiceConfigCreateHandle 创建的。
事件管道配置
如前所述,事件管道具有一些可配置的属性,可以在管道创建后通过 PFEventPipelineConfig 结构体参数提供。 可配置的属性有:- maxEventsPerBatch:在写入 PlayFab 之前分批处理的最大事件数。
- maxWaitTimeInSeconds:管道在发送不完整批次之前等待的最长时间。
- pollDelayInMs:管道清空事件缓冲区后再次读取该缓冲区的等待时长。
- compressionLevel:定义压缩算法所使用的压缩级别。有关压缩的更多详细信息,请参阅 GZIP 压缩。
- retryOnDisconnect:事件管道将重试因连接丢失而失败的事件发送。仅适用于遥测事件管道。
- bufferSize:管道缓冲区中的事件数量限制。
默认值
如果 PFEventPipelineConfig 只指定了部分属性,那些为空的属性将被覆盖并使用默认值。
有关如何更新事件管道的任何这些属性的示例,请参阅 更新管道配置。
GZIP 压缩
事件管道提供了使用 GZIP 压缩标准压缩正文有效负载的选项。 可以在 PFEventPipelineConfig 结构体内指定所需的压缩级别,该结构体是 PFEventPipelineUpdateConfiguration API 参数的一部分。 较低的压缩级别可实现较小的压缩,但速度最快;较高的压缩级别可实现更好的压缩率,但压缩速度最慢。压缩率的差异都取决于发送的数据类型。根据数据的大小和随机性,压缩率甚至在不同级别上都可能相同。 权衡: 由于运行压缩算法增加了复杂性,使用压缩会增加 CPU 时间,但另一方面,网络正文有效负载会显著减少。因此,根据游戏需求和资源,是否应使用压缩由游戏开发人员自己决定。 根据内部验证,CPU 时间平均增加 20%,有效负载正文大小平均减少 91%。这些百分比可能会根据被压缩数据的负载大小和复杂性而有很大差异。事件处理程序
作为管道创建的一部分,游戏开发人员可以提供两个可选的事件处理程序,它们会在事件上传时被调用。 但是,如果游戏开发人员想要”即发即忘”的体验,可以省略提供事件处理程序。 可以提供的事件处理程序如下:- PFEventPipelineBatchUploadSucceededEventHandler:顾名思义,它接收所有成功上传到 PlayFab 的事件。
- PFEventPipelineBatchUploadFailedEventHandler:它将接收经过管道重试逻辑后所有失败的事件。
管道创建示例
下面你可以找到基于前面讨论的主题实例化事件管道的不同示例。-
使用实体身份验证创建遥测事件管道
如果开发人员想要发送遥测事件并且不需要使用遥测密钥身份验证,则 PFEventPipelineCreateTelemetryPipelineHandleWithEntity API 可用于此目的,如以下示例所示:
此示例展示了如何创建使用实体身份验证且没有处理程序的遥测事件管道。这意味着管道发送事件后就不再关心结果。
-
使用遥测密钥身份验证创建遥测事件管道
如果开发人员想要发送遥测事件并需要使用遥测密钥身份验证,则 PFEventPipelineCreateTelemetryPipelineHandleWithKey API 可用于此目的,如以下示例所示:
此示例展示了如何创建不使用实体身份验证的遥测事件管道。 事件管道开始使用遥测密钥上传事件,并且以后可以添加实体。请参阅切换到实体身份验证或更新实体
-
PlayStream 事件管道创建
如果开发人员想要发送 PlayStream 事件,则 PFEventPipelineCreatePlayStreamPipelineHandle API 可用于此目的,如以下示例所示:
此示例展示了如何创建使用实体身份验证且没有处理程序的 PlayStream 事件管道。这意味着管道发送事件后就不再关心结果。
-
使用事件处理程序的事件管道
此示例展示了如何将事件处理程序提供给管道创建 API。
发送事件
事件管道创建后,发送事件是一项简单的操作。游戏开发人员应调用 PFEventPipelineEmitEvent API,该 API 接收现有的事件管道句柄和他们想要发送的事件。E_PF_API_CLIENT_REQUEST_RATE_LIMIT_EXCEEDED (0x892354dd)
切换到实体身份验证或更新实体
如果一个管道只使用遥测密钥配置创建,则可以切换到实体身份验证,或者如果你想要更新你的管道以使用不同的实体。 通过使用 PFEventPipelineAddUploadingEntity,可以将实体附加到正在运行的管道,而无需重新初始化它。它还会替换现有实体(如果有)。 示例: 在游戏执行开始时使用遥测密钥配置创建遥测事件管道。这样做的可能原因是尚无玩家身份或者我们还不想记录与玩家相关的任何内容。切换到遥测密钥身份验证
在前一个方案的基础上,如果开发人员想要切换回遥测身份验证并将事件记录与实体分离,他们可以调用 PFEventPipelineRemoveUploadingEntity 并像这样传入事件管道句柄:更新管道配置
可以使用 PFEventPipelineUpdateConfiguration API 轻松更新管道,该 API 接收现有的事件管道句柄和一个新的配置结构体,如下所示:无效/停用的遥测密钥
如果在管道创建时提供的遥测密钥被停用或无效,任何使用该遥测密钥运行的事件管道将在发现密钥无效或被停用后立即开始失败。 在客户重新激活密钥的最终情况下,管道不会意识到这一点,并将继续通过失败事件处理程序发送失败信息。值得一提的是,此行为是基于会话的,这意味着如果游戏重启,将创建一个新的管道,并能够再次上传事件。管道句柄生存期
与其他 PlayFab 句柄一样,事件管道句柄使用重复/关闭模式:- PFEventPipelineCloseHandle:关闭管道句柄。当管道的最后一个句柄被关闭时,管道将被销毁,任何剩余的缓冲事件都会被刷新。
- PFEventPipelineDuplicateHandle:复制管道句柄。原始句柄和复制的句柄必须使用 PFEventPipelineCloseHandle 独立关闭。
