

# 架构注册表的工作原理
<a name="schema-registry-works"></a>

本节介绍架构注册表中序列化和反序列化过程的工作原理。

1. 注册架构：如果注册表中尚不存在架构，则可以使用与目标名称类似的架构名称（例如，test\_topic、test\_stream、prod\_firehose）注册架构，或者创建者可以为架构提供自定义名称。创建者还可以在创建架构时将键值对（例如 source: msk\_kafka\_topic\_A）作为元数据添加到架构，或者将 Amazon 标签添加到架构。注册架构后，架构注册表会将架构版本 ID 返回到序列化程序。如果架构存在，但序列化程序使用的是不存在的新版本，则架构注册表将检查架构引用兼容性规则，以确保兼容新版本，然后再将其注册为新版本。

   有两种架构注册方法：手动注册和自动注册。您可以通过 Amazon Glue 控制台或 CLI/SDK 手动注册架构。

   在序列化程序设置中打开自动注册时，将执行架构自动注册。如果创建者配置中未提供 `REGISTRY_NAME`，则自动注册将在默认注册表（default-registry）下注册新架构版本。请参阅[安装 SerDe 库](schema-registry-gs-serde.md)，了解有关指定自动注册属性的信息。

1. 序列化程序根据架构验证数据记录：当生成数据的应用程序注册了其架构时，架构注册表序列化程序将验证应用程序生成的记录是否使用与已注册架构匹配的字段和数据类型进行结构化。如果记录架构与注册架构不匹配，则序列化程序将返回异常，并且应用程序将无法将记录传递到目标。

   如果不存在架构，并且架构名称不是通过创建者配置提供，则将使用与主题名称（如果是 Apache Kafka 或 Amazon MSK）或流名称（如果是 Kinesis Data Streams）类似的名称创建架构。

   每条记录都有架构定义和数据。根据架构注册表中的现有架构和版本查询架构定义。

   默认情况下，创建者缓存架构定义和已注册架构的架构版本 ID。如果记录的架构版本定义与缓存中的可用内容不匹配，则创建者将尝试使用架构注册表验证架构。如果架构版本有效，则其版本 ID 和定义将在创建器上本地缓存。

   您可以在[安装 SerDe 库](schema-registry-gs-serde.md)的步骤 3 中的可选创建器属性内调整默认缓存周期（24 小时）。

1. 序列化和传递记录：如果记录符合架构，则序列化程序将使用架构版本 ID 装饰每条记录，根据选定的数据格式（AVRO、JSON、Protobuf，或即将推出的其他格式）序列化记录，压缩记录（可选的创建器配置），并将其传送到目标。

1. 使用者反序列化数据：读取此数据的使用者使用架构注册表反序列化程序库，该库从记录负载解析架构版本 ID。

1. 反序列化程序可能会从模式注册表请求架构：如果这是反序列化程序第一次看到具有特定架构版本 ID 的记录，则使用架构版本 ID，反序列化程序将从架构注册表请求架构并在使用器上本地缓存架构。如果架构注册表无法反序列化记录，则使用者可以录入记录中的数据，然后继续或停止应用程序。

1. 反序列化程序使用架构反序列化记录：当反序列化程序从架构注册表中检索架构版本 ID 时，反序列化程序将解压缩记录（如果创建器发送的记录已压缩），并使用架构反序列化记录。现在，应用程序处理记录。

**注意**  
加密：您的客户端通过 API 调用与架构注册表通信，这些调用使用 HTTPS 上的 TLS 加密对传输中的数据进行加密。存储于架构注册表中的架构始终使用服务托管 Amazon Key Management Service（Amazon KMS）密钥。

**注意**  
用户授权：架构注册表支持基于身份的 IAM policy。