0

我有一个基于 DynamoDB 的 Web 应用程序,它使用 DynamoDB 存储我的大型 JSON 对象并通过 Web API 对它们执行简单的 CRUD 操作。我想添加一个新表,其作用类似于这些值的分类。用户应该能够从选择框中选择对象所属的类别。如果不存在所需的类别,用户应该能够创建一个新的类别,指定一个名称,该名称将来可用于其他对象。

对应用程序来说至关重要的是,这些类别中的每一个都被赋予一个从第一个从 1 开始递增的整数 ID。这些自动生成的数字将变成可重现的序列号,用于后端报告,不会使用用户可见的文本姓名。

所以我想有一个简单的 API 可以从网络前端获得,它允许我:

A) GET /category : 生成映射到 ID 的所有类别的 { int : string, ... }

B) PUSH /category :接受字符串并将字符串存储到下一个整数

以下是有关如何处理此类项目的一些想法。

  1. 使用整数索引将其存储在 DynamoDB 中。这种叶子有一些好处,但它还有很多不足之处。首先,DynamoDB 中没有自动递增的 ID,但我绝对可以获取表的状态,创建一个新的 ID,并存储结果。这可能在一致性和竞争条件方面存在问题,但可能有一种方法可以安全地实现这一点。但是,以这种方式使用 DynamoDB 可能是一个很大的反模式。

  2. 将其作为一个对象存储在具有一些随机索引的表中。只需将映射存储为 JSON 对象。这真的忘记了 DynamoDB 中表的概念,并将其用作简单文件。它也可能会遇到一些竞争条件问题。

  3. 使用 AWS ElasticCache 拥有 Redis 键值存储。这可能是“正确”的决定,但缺点是 ElasticCache 是始终在线的数据库产品,您按小时付费。对于像我这样的低流量网站,我认为我会支付最低 12 美元/月的费用,而且由于数量少,我真的希望每次访问/更新都需要付费。我不确定 Redis 是否有按照我需要的方式构建的自动增量功能。但是创建一个获取表格长度、添加一个并存储一个新值的事务是非常简单的。使用此解决方案可以轻松避免竞争条件。

  4. 使用 AWS Aurora 或 MYSQL 等 SQL 数据库。好吧,这与 Redis 具有相同的优势,但它也比 Redis 更加矫枉过正,而且它的成本也更高,而且它仍然一直在运行。

  5. 在内存 Web 服务或 MongoDB 等中运行我自己的……你仍然需要为持续运行的容器付费。编写自己的东西显然很愚蠢,但我确信有一些服务可以完美地解决这个问题,但它们都需要一个恒定的容器才能运行。

有没有一种食物方式来存储一个简单的列表,或者像这样的整数映射,而不需要花费固定的每月成本?有没有更好的方法来使用 DynamoDB 做到这一点?

4

1 回答 1

1

将 存储maxCounterValue为 DyanamoDB 中的项目。对于 PUSH /category,执行以下操作:

  1. 获取当前maxCounterValue.
  2. 事务写入:
    1. 将类别nameid放入一个新项目中id = maxCounterValue + 1
    2. 更新maxCounterValue +1,添加一个 ConditionExpression 来检查maxCounterValue = :valueFromGetOperation
  3. 如果 TransactWrite 失败,再次从 1 开始,再尝试 X 次
于 2022-02-12T20:26:08.943 回答