在客户端生成密钥的缺点
disadvantages of generating keys at client side
在插入文档时,如果密钥是在客户端生成的。它会减慢单个机器或集群上的写入速度吗?
我问是因为我认为服务器端生成的密钥肯定是唯一的,不需要检查唯一性。
然而,在客户端生成密钥时有什么缺点或需要记住的事情?(在单机、分片、即将到来的主-主复制中)
在客户端生成密钥不会对 ArangoDB 产生任何显着的性能影响。 ArangoDB 无论如何都会解析传入的 JSON ,并且总是会在其中寻找 _key
属性。如果它不存在,它将自己创建一个。如果它存在于 JSON 中,将验证它的句法正确性(因为文档键中只允许使用某些字符)。后一种操作仅在 JSON 中指定 _key
值时发生,但其影响很可能可以忽略不计,尤其是与插入文档时发生的其他事情(例如网络延迟)相比时,磁盘写入等
无论是否指定了用户定义的 _key
值,ArangoDB 都会检查集合的主索引以查找具有相同键的文档。如果它存在,插入将失败并违反唯一键约束。如果不存在,插入将继续。如前所述,此操作将始终发生。在主索引中查找文档具有 O(1) 的摊销复杂性,与网络延迟、磁盘写入等相比应该再次忽略不计。请注意,即使 ArangoDB 生成密钥,此检查也会始终发生。这是因为一个集合可能包含客户端生成的密钥和 ArangoDB 生成的密钥的混合,并且 ArangoDB 仍然必须确保它没有生成客户端之前也生成过的密钥。
在集群中,将发生相同的步骤,除了客户端会将插入发送到协调器节点,协调器节点需要将插入转发到数据库服务器节点。这与是否指定密钥无关。 _key
属性可能是集合的分片键,因此协调器会将请求发送到恰好一个 dbserver 节点。如果 _key
属性不是集合的分片键,因为它明确设置了不同的分片键,那么用户定义的键无论如何都是不允许的。
到目前为止的总结:就 ArangoDB 而言,在客户端生成密钥或让 ArangoDB 生成它们之间应该没有相关的性能差异。
在客户端应用程序中生成密钥的优缺点包括:
+
客户端应用程序可以确保密钥遵循 ArangoDB 生成的密钥不能保证的一些必需的模式/语法,并且可以完全控制密钥创建算法(例如,可以在多租户中使用特定于租户的密钥申请)
-
客户端可能需要一些数据存储来存储其密钥生成器状态(例如,最后生成的密钥的 ID)以防止重复(也在客户端应用程序重新启动后)
-
当在集群模式下使用不同的分片键时,不允许使用客户端键
在插入文档时,如果密钥是在客户端生成的。它会减慢单个机器或集群上的写入速度吗?
我问是因为我认为服务器端生成的密钥肯定是唯一的,不需要检查唯一性。 然而,在客户端生成密钥时有什么缺点或需要记住的事情?(在单机、分片、即将到来的主-主复制中)
在客户端生成密钥不会对 ArangoDB 产生任何显着的性能影响。 ArangoDB 无论如何都会解析传入的 JSON ,并且总是会在其中寻找 _key
属性。如果它不存在,它将自己创建一个。如果它存在于 JSON 中,将验证它的句法正确性(因为文档键中只允许使用某些字符)。后一种操作仅在 JSON 中指定 _key
值时发生,但其影响很可能可以忽略不计,尤其是与插入文档时发生的其他事情(例如网络延迟)相比时,磁盘写入等
无论是否指定了用户定义的 _key
值,ArangoDB 都会检查集合的主索引以查找具有相同键的文档。如果它存在,插入将失败并违反唯一键约束。如果不存在,插入将继续。如前所述,此操作将始终发生。在主索引中查找文档具有 O(1) 的摊销复杂性,与网络延迟、磁盘写入等相比应该再次忽略不计。请注意,即使 ArangoDB 生成密钥,此检查也会始终发生。这是因为一个集合可能包含客户端生成的密钥和 ArangoDB 生成的密钥的混合,并且 ArangoDB 仍然必须确保它没有生成客户端之前也生成过的密钥。
在集群中,将发生相同的步骤,除了客户端会将插入发送到协调器节点,协调器节点需要将插入转发到数据库服务器节点。这与是否指定密钥无关。 _key
属性可能是集合的分片键,因此协调器会将请求发送到恰好一个 dbserver 节点。如果 _key
属性不是集合的分片键,因为它明确设置了不同的分片键,那么用户定义的键无论如何都是不允许的。
到目前为止的总结:就 ArangoDB 而言,在客户端生成密钥或让 ArangoDB 生成它们之间应该没有相关的性能差异。
在客户端应用程序中生成密钥的优缺点包括:
+
客户端应用程序可以确保密钥遵循 ArangoDB 生成的密钥不能保证的一些必需的模式/语法,并且可以完全控制密钥创建算法(例如,可以在多租户中使用特定于租户的密钥申请)
-
客户端可能需要一些数据存储来存储其密钥生成器状态(例如,最后生成的密钥的 ID)以防止重复(也在客户端应用程序重新启动后)
-
当在集群模式下使用不同的分片键时,不允许使用客户端键