内容审阅参考体系结构
并非每个人在网上玩游戏时都行为得当,因此为了在玩家之间保持文明、热情和愉悦的体验,需要进行一些审阅。 通过检测社区生成的不适当消息内容,在公众看到这些内容前将其消除或删除,您能够帮助实现这一目标。
本文介绍 GitHub 上的此示例中使用的体系结构。 请注意,此参考体系结构中的代码只是一个指南示例,在用于生产环境之前,可能还有需要优化的地方。
体系结构关系图
体系结构服务
- 内容审阅者 - 检查文本、图像和视频资料中是否存在可能具有攻击性、危险或其他不良的内容。 当发现此类资料时,此服务会对其内容应用相应的标签(标志)。
- Azure 流量管理器 - 当在全球多个区域间进行扩展时,此服务将通过 DNS 选择要连接到的最近区域。
- 事件中心 - 专为实时接收和处理大量事件(在本例中为聊天字符串)而量身定制的服务,以大幅减少或彻底消除管理开销。
- Azure Function - 可按需运行代码的无服务器计算服务 - 在本用例中,代码将调用不同的认知服务。
体系结构注意事项
您只需创建一个事件中心命名空间,该命名空间将包含分别用于发送和接收消息的 2 个事件中心。
Azure 内容审阅者检测亵渎内容(已屏蔽或未屏蔽)和 PII。 它支持多个内容类型:文本、图像和视频。 文本是此体系结构中涉及的唯一内容类型。
部署模板
单击下面的按钮,将项目部署到您的 Azure 订阅:
此操作将触发模板部署,即系统会将 azuredeploy.json ARM 模板文件部署到您的 Azure 订阅,从而创建必要的 Azure 资源。 这可能会在您的 Azure 帐户中产生相应费用。
请查看一般指南文档,其中有一部分概述了 Azure 服务的命名规则和限制。
备注
如果您对 ARM 模板的工作原理感兴趣,请参阅此参考体系结构中使用的每个不同服务对应的 Azure 资源管理器模板文档:
有两种类型的 Azure 认知服务订阅。 第一种是单一服务订阅,例如计算机视觉或语音服务。 单一服务订阅仅限所订阅的服务。 第二种类型是多服务订阅。 这样,通过单一订阅就能获得多种 Azure 认知服务。 此选项还将合并帐单。 为了使此参考体系结构尽可能模块化,认知服务均设置为单一服务。
最后,添加以下函数 应用程序设置,以便示例项目可以连接 Azure 服务:
- EVENTHUB_CONNECTION_STRING = 所创建的 Azure 事件中心命名空间的连接字符串
- CONTENTMODERATOR_KEY - 用于访问已创建的 Azure 内容审阅者认知服务的访问密钥
提示
要在本地运行 Azure Functions,请使用这些相同的应用设置更新 local.settings.json 文件。
分步操作
- 玩家的设备在 Azure 流量管理器确定的特定区域中打开与聊天服务器的持久加密连接。 聊天服务器创建一个进程,负责维护与玩家的连接以及一些基本的元数据。
- 玩家的客户端通过先前创建的安全连接向聊天服务器发送聊天消息。 此玩家在聊天服务器中的进程接收消息并进行解密和解析。
- 运行标准验证,聊天服务器调用 Azure 事件中心服务(以保持消息顺序)。
- Azure 事件中心充当 Azure Function的输入触发器。
- Azure Function 调用 Azure 内容审阅者服务,该服务审阅玩家发送的消息并返回结果。
- 设置另一个 Azure 事件中心作为 Azure Function 的输出。
- 聊天服务器接收来自 Azure 事件中心的消息。
- 聊天服务器可选择将原始消息和来自 Azure 内容审阅者服务的结果都保存在 Azure Data Lake Storage 等永久性存储中。
- 如果此消息已存储,则可选择将其保存到 Azure Data Lake Analytics 中以供分析。
- 然后,来自 Azure 内容审阅者服务的结果将被发送到聊天服务器中的接收者玩家进程。 该进程对此消息进行进一步验证,对其进行序列化,然后通过它们的安全连接将其发送到接收者玩家的设备。
Azure 事件中心
请参阅此快速入门,了解以多种编程语言将事件发送到事件中心的简单实现。 此处提供了一些其他示例。
由一个 Azure 事件中心对另一个 Azure 事件中心触发的函数
触发事件中心触发器函数时,会将触发此函数的消息作为字符串传入此函数中。 使用事件中心输出绑定将事件写入事件流。
[return: EventHub("ehigce-output", Connection = "EventHubConnectionAppSetting")]
public static string Run([EventHubTrigger("ehigce-input", Connection = "EventHubConnectionAppSetting")] string chatString, ILogger log)
请查看调用认知服务时出现 401 拒绝访问错误的常见原因和解决方案。
安全注意事项
不要将任何事件中心或认知服务连接字符串硬编码到函数的源中。 但至少应充分利用函数应用设置,或者,若要获取更高的安全性,请改用密钥保管库。 有一个指南介绍如何创建密钥保管库、如何将托管服务与函数标识结合使用,以及如何从函数中读取存储在密钥保管库中的机密。
查看事件中心身份验证和安全模型概述并付诸实践,确保只有聊天服务器可以与事件中心通信。
缩放
此体系结构中有两处可能会成为瓶颈,您应该知晓并制定应对方案:
- 认知服务具有良好的可伸缩性,但默认受到限制。 如果您计划大规模使用认知服务,请联系 Azure 支持以增加容量。
- 需要扩展接收 Azure 事件中心响应的聊天服务器。 请启动足够多的虚拟机来满足需求。
备选方案
如果您有兴趣使用基于 Apache Spark 的平台收集分析数据,可以考虑利用 Azure Redis 缓存和 Azure Databricks。
其他资源和示例
适用于 Unity 的 Azure 事件中心 SDK:这是一个沙盒项目。 这篇文章中的内容不受支持,因此可能已过期或不处于工作状态。
定价
如果您没有 Azure 订阅,可以创建免费帐户,开始使用 12 个月的免费服务。 除非您超出这些服务的使用限制,否则无需为 Azure 免费帐户中包含的这些免费服务付费。 了解如何通过 Azure 门户或使用情况文件查看服务使用情况。
您需要承担运行这些参考体系结构时所使用的 Azure 服务的费用。 总金额将因使用情况而异。 请参阅参考体系结构中使用的每项服务的定价网页:
您还可以使用 Azure 定价计算器,以配置和估算您计划使用的 Azure 服务的成本。