在 lambda 函数中为 dynamodb 生成唯一密钥
Generating a unique key for dynamodb within a lambda function
DynamoDB 没有为您自动生成唯一密钥的选项。
在示例中,我看到人们用字段组合创建一个 uid,但是有没有办法为没有任何值组合的数据创建一个唯一 ID,这些值组合可以充当唯一标识符?我的问题专门针对 lambda 函数。
我看到的一个选项是基于时间戳创建一个 uuid,最后有一个计数器,插入它(或检查它是否存在),如果重复,则以增量重试,直到成功。但是,这意味着我可能 运行 超过 lambda 函数的执行时间限制而无需创建条目。
我们使用 idgen npm 包来创建 id。长度问题比较多根据计数增减尺寸
https://www.npmjs.com/package/idgen
与 UUID 或 GUID 相比,我们更喜欢它,因为它们只是数字。使用 DynamoDB,它是 guid/uuid 的所有字符,使用 idgen,您可以使用更少的字符创建更多的 id,并减少冲突。由于每个字符都有更多的范围。
希望对您有所帮助。
编辑 1:
注意!从 idgen 1.2.0 开始,超过 16 个字符的 ID 将包含一个基于当前毫秒时间的 7 个字符的前缀,以减少冲突的可能性。
NPM 上提供的 UUID 包正是这样做的。
https://www.npmjs.com/package/uuid
您可以选择 4 种不同的生成算法:
- V1 时间戳
- V3 命名空间
- V4随机
- V5 命名空间(再次)
这会给你:
"A UUID [that] is 128 bits long, and can guarantee uniqueness across
space and time." - RFC4122
生成的 UUID 将如下所示:1b671a64-40d5-491e-99b0-da01ff1f3341
如果它太长,您始终可以在 Base64 中对其进行编码以获得 G2caZEDVSR6ZsAAA2gH/Hw
但您将失去通过原始 UUID 中包含的时间和命名空间信息来操作数据的能力(这对您来说可能无关紧要)。
awsRequestId
看起来像它实际的 V.4 UUID(随机),下面的代码片段:
exports.handler = function(event, context, callback) {
console.log('remaining time =', context.getRemainingTimeInMillis());
console.log('functionName =', context.functionName);
console.log('AWSrequestID =', context.awsRequestId);
callback(null, context.functionName);
};
如果你想自己生成这个,你仍然可以使用 https://www.npmjs.com/package/uuid or Ulide (slightly better in performance) to generate different versions of UUID based on RFC-4122
对于 Go 开发人员,您可以使用 Google's UUID, Pborman, or Satori. Pborman is better in performance, check these articles and benchmarks 中的这些包了解更多详细信息。
可以找到有关通用唯一标识符规范的更多信息here。
如果你正在使用Node.js8.x,你可以使用uuid模块。
var AWS = require('aws-sdk'),
uuid = require('uuid'),
documentClient = new AWS.DynamoDB.DocumentClient();
[...]
Item:{
"id":uuid.v1(),
"Name":"MyName"
},
如果您正在使用 Node.js 10.x,您可以在没有 uuid 模块的情况下使用 awsRequestId。
var AWS = require('aws-sdk'),
documentClient = new AWS.DynamoDB.DocumentClient();
[...]
Item:{
"id":context.awsRequestId,
"Name":"MyName"
},
这是一个更好的解决方案。
可以在不使用任何库的情况下构建此逻辑,因为有时导入 lambda 函数层会很困难。您可以在下面找到 link 代码,该代码将生成唯一 ID 并将其保存在 SQS 队列中,而不是 DB,后者会产生写入、获取和删除 ID 的成本。
还提供了一个 cloudformation 模板,您可以将其部署到您的帐户中,它将设置整个应用程序。 link.
中提供了详细说明
请参考下面的link
https://github.com/tanishk97/UniqueIdGeneration_AWS_CFT/wiki
如果你使用 node js runtime,你可以使用这个
const crypto = require("crypto")
const uuid = crypto.randomUUID()
或
import { randomUUID } from 'crypto'
const uuid = randomUUID()
DynamoDB 没有为您自动生成唯一密钥的选项。
在示例中,我看到人们用字段组合创建一个 uid,但是有没有办法为没有任何值组合的数据创建一个唯一 ID,这些值组合可以充当唯一标识符?我的问题专门针对 lambda 函数。
我看到的一个选项是基于时间戳创建一个 uuid,最后有一个计数器,插入它(或检查它是否存在),如果重复,则以增量重试,直到成功。但是,这意味着我可能 运行 超过 lambda 函数的执行时间限制而无需创建条目。
我们使用 idgen npm 包来创建 id。长度问题比较多根据计数增减尺寸
https://www.npmjs.com/package/idgen
与 UUID 或 GUID 相比,我们更喜欢它,因为它们只是数字。使用 DynamoDB,它是 guid/uuid 的所有字符,使用 idgen,您可以使用更少的字符创建更多的 id,并减少冲突。由于每个字符都有更多的范围。
希望对您有所帮助。
编辑 1:
注意!从 idgen 1.2.0 开始,超过 16 个字符的 ID 将包含一个基于当前毫秒时间的 7 个字符的前缀,以减少冲突的可能性。
NPM 上提供的 UUID 包正是这样做的。
https://www.npmjs.com/package/uuid
您可以选择 4 种不同的生成算法:
- V1 时间戳
- V3 命名空间
- V4随机
- V5 命名空间(再次)
这会给你:
"A UUID [that] is 128 bits long, and can guarantee uniqueness across space and time." - RFC4122
生成的 UUID 将如下所示:1b671a64-40d5-491e-99b0-da01ff1f3341
如果它太长,您始终可以在 Base64 中对其进行编码以获得 G2caZEDVSR6ZsAAA2gH/Hw
但您将失去通过原始 UUID 中包含的时间和命名空间信息来操作数据的能力(这对您来说可能无关紧要)。
awsRequestId
看起来像它实际的 V.4 UUID(随机),下面的代码片段:
exports.handler = function(event, context, callback) {
console.log('remaining time =', context.getRemainingTimeInMillis());
console.log('functionName =', context.functionName);
console.log('AWSrequestID =', context.awsRequestId);
callback(null, context.functionName);
};
如果你想自己生成这个,你仍然可以使用 https://www.npmjs.com/package/uuid or Ulide (slightly better in performance) to generate different versions of UUID based on RFC-4122
对于 Go 开发人员,您可以使用 Google's UUID, Pborman, or Satori. Pborman is better in performance, check these articles and benchmarks 中的这些包了解更多详细信息。
可以找到有关通用唯一标识符规范的更多信息here。
如果你正在使用Node.js8.x,你可以使用uuid模块。
var AWS = require('aws-sdk'),
uuid = require('uuid'),
documentClient = new AWS.DynamoDB.DocumentClient();
[...]
Item:{
"id":uuid.v1(),
"Name":"MyName"
},
如果您正在使用 Node.js 10.x,您可以在没有 uuid 模块的情况下使用 awsRequestId。
var AWS = require('aws-sdk'),
documentClient = new AWS.DynamoDB.DocumentClient();
[...]
Item:{
"id":context.awsRequestId,
"Name":"MyName"
},
这是一个更好的解决方案。
可以在不使用任何库的情况下构建此逻辑,因为有时导入 lambda 函数层会很困难。您可以在下面找到 link 代码,该代码将生成唯一 ID 并将其保存在 SQS 队列中,而不是 DB,后者会产生写入、获取和删除 ID 的成本。
还提供了一个 cloudformation 模板,您可以将其部署到您的帐户中,它将设置整个应用程序。 link.
中提供了详细说明请参考下面的link
https://github.com/tanishk97/UniqueIdGeneration_AWS_CFT/wiki
如果你使用 node js runtime,你可以使用这个
const crypto = require("crypto")
const uuid = crypto.randomUUID()
或
import { randomUUID } from 'crypto'
const uuid = randomUUID()