【问题标题】:DynamoDB Friends designDynamoDB Friends 设计
【发布时间】:2016-03-09 18:05:10
【问题描述】:

我需要在 dynamodb 中创建一个朋友表。我正在尝试决定如何设计表格,并查看了亚马逊团队成员曾经推荐的内容。

http://www.slideshare.net/AmazonWebServices/amazon-dynamodb-design-patterns-for-ultrahigh-performance-apps-dat304-aws-reinvent-2013-28436991

他们推荐一种双向关系:

Friend 1 | Friend 2
-------------------
BOB      |   ALICE
ALICE    |   BOB
ALICE    |   JOHN

然后你可以查询好友 1 来获取所有好友。我看到的问题是这不是跨国的。例如说 BOB 不想再和 ALICE 做朋友了。我们需要删除 2 条记录,这样当 BOB 和 ALICE 查询他们的朋友列表时,他们就不会出现在任何一个列表中。问题是如果只有一个删除操作成功(例如网络丢失或超过吞吐量)怎么办?那么对于 BOB 来说,Alice 仍然是 f 朋友,但对于 Alice,BOB 不再是朋友。这是不一致的。我认为这将是非常糟糕的做法。我是否遗漏了什么,因为这对我来说是一个理想的设计,但对我来说这个问题会让它无法接受?我的想法是建立一种单向关系,然后在 Friend 2 上创建一个全局二级索引,这样我的读取量就会加倍(表上读取 1 次,索引上读取 1 次),但只有一个项目用于关系,如果说我需要删除它是安全的,因为如果 BOB 或 ALICE 不想再成为朋友,则只有一个项目可以删除。推荐的解决方案是好的,我遗漏了一些东西,还是存在缺陷,是否有更好的解决方案?如果可以的话,我想避免使用全局索引,因为它会自动使我的成本翻倍,但目前我没有看到更好的方法。

【问题讨论】:

    标签: amazon-web-services database-design amazon-dynamodb database nosql


    【解决方案1】:

    我将采用链接中提到的解决方案,假设有 100 个用户,这让另外 100 个朋友在桌子上进行 100*100*2 的写操作。人们更有可能每天结交朋友,但与添加朋友相比,删除朋友的可能性要小得多。在这个解决方案中,您可以避免任何索引,就像您之前所说的那样。

    现在你的删除问题

    Solution 1:
    AWS has introduced Lambda which would be effective in this, configuring with
    DynamoDB on deletion of row you can trigger a lambda function which will 
    check if both the operation was performed successfully or not.
    
    Solution 2:
    Rather then directly removing the row from DynamoDB put the request in a SQS queue, 
    A reader will read the message and remove both the records. 
    

    【讨论】:

    • 感谢您的回复。我对AWS不太熟悉,那么Lambada或者SQS会保证交易吗?假设 Lambada 或 SQS 尝试进行操作,但由于超出了 dynamodb 规定而被拒绝,它会自动重试直到成功还是它如何工作使其与直接调用 dynamodb 不同?
    • @user2924127 SQS 是一个队列系统,它会保证消息至少被传递一次,你可以检查操作是否成功,然后删除消息,否则重试。这在 Lambda 的情况下是不一样的
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2019-03-10
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多