假设我有 DynamoDB 表
orders
,它存储每个客户创建的订单。该表有一列 OrderId
(主键)和一列 CustomerId
。客户可以创建/删除订单。
如果我想实施配额,比如说,每个客户只能下不超过 1000 个订单。 我如何实现这个?
一种方法是在客户尝试创建新订单之前实时查询/统计客户的所有现有订单。我担心这会显着降低 API 的性能。
另一种方法是创建一个单独的表来保存每个客户的订单总数。每次创建新订单前,读取该数字,如果未达到配额则加1,如果达到限制则返回错误。另一方面,如果订单被删除,则将此数字减少 1。
两种策略似乎都存在并发问题。当多个并发请求尝试创建新订单时如何避免竞争情况?
这项任务有什么众所周知的策略吗?预先感谢!
2 个表是正常方法,但为了避免竞争条件等...您可以只使用 TransactWriteItems。这会减慢您使用 UpdateItem 以及计数器表上的条件创建新订单的速度。这是以符合 ACID 的方式完成的,确保了准确的计数。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html