使用 DynamoDB 将无服务器应用程序中的用户 ID 的 UUID 转换为整数 - 有更好的方法吗?

问题描述 投票:0回答:1

我正在使用 AWS Lambda 和 DynamoDB 开发无服务器应用程序。我们已经使用第三方服务实现了视频通话功能。我们使用 UUID 作为应用程序中用户的全局标识符。

此第三方服务的 Android SDK 不接受 UUID 作为用户 ID;它只接受 2,147,483,647 以内的整数。这给我们带来了限制,因为 UUID 是确保唯一性的更好选择。

为了解决这个问题,我们在 DynamoDB 表中创建了一个名为 NumberId 的单独字段。这个NumberId是根据UUID计算出来的。具体来说,我们将 UUID 转换为一个大整数并取模 2,147,483,647。这可确保整数符合 SDK 施加的限制。

# Pseudo-code to convert UUID to NumberId
number_id = uuid_to_bigint(user_uuid) % 2147483647

虽然此方法目前有效,但它有一些缺点:

随着我们的用户群增长(估计发生在 50,000 名用户左右),ID 冲突的可能性很高。 我们可以在用户创建期间检查现有的 NumberId,但这会使我们的无服务器 AWS Lambda 函数随着用户群的增长而变慢且效率降低。

我们使用的是无服务器架构,因此顺序 ID 等传统方法不是合适的选择。 我知道我们可以切换第三方服务,但这是我们最后的手段。

是否有更好的方法来生成限制为 2,147,483,647 且与我们的无服务器架构和 DynamoDB 兼容的唯一整数? 有没有人遇到这个问题并提出更具可扩展性的解决方案? 预先感谢您的见解!

aws-lambda amazon-dynamodb serverless
1个回答
0
投票

处理此问题的最常见方法是使用随机数,并使用该数字作为 DynamoDB 中的主键。您将生成号码:

int boundedInt = 
     new SecureRandom()
        .ints(-1, Integer.MAX_VALUE)
        .findFirst()
        .getAsInt();

然后用这个数字作为主键/分区键。不要预先检查该号码是否已在您的数据库中 - DynamoDB 会告诉您,您可以生成另一个号码。这意味着您的插入代码需要准备好在需要时重试几次。

如果您真的只期望 ~50,000 个条目,这应该很快,并且碰撞的可能性并不可怕。

© www.soinside.com 2019 - 2024. All rights reserved.