什么是适合进行高吞吐量更新的数据库解决方案?

时间:2018-12-19 21:14:15

标签: database postgresql nosql amazon-dynamodb amazon-rds

假设我是一个订阅服务,并且我有一个表格,每一行代表客户数据。

我想构建一个使用每日客户数据快照的系统。每日快照包含当前所有现有客户的数据(即,将有新客户的行,而未订阅的客户将不会出现在此数据中)。我还需要使用开始时间和结束时间来跟踪每个客户订阅的持续时间。如果客户重新订阅,则该开始和停止时间的另一个条目将更新为该客户。示例记录/模式如下所示。

{
    "CustomerId": "12345",
    "CustomerName": "Bob",
    "MagazineName": "DatabaseBoys",
    "Gender": "Male",
    "Address": "{streetName: \"Sesame Street\", ...}",
    "SubscriptionTimeRanges": [{start:12345678, end: 23456789}, {start:34567890, end: 45678901},...]
}
  • 我每天每天将处理超过250,000行数据
  • 我需要知道快照 中当前是否存在数据库中的任何记录
  • 表的总大小将> 250,000
  • 拥有关系数据库(例如,联接到包含杂志信息的另一个表)将带来长期利益
  • 我想通过CustomerIdMagazineName来获取记录
  • 写入不应阻止读取
  • 要实现这一目标,我预计需要扫描整个表,遍历每条记录,并分别更新每条记录的SubscriptionTimeRanges数组/ JSON blob
  • 写入的延迟并不是一个硬性要求,但与此同时,我不应该期望花费一个多小时来更新所有这些记录(如果是更新,可以在单个事务中完成。) 。?)
  • 阅读也应该很快
  • 并发处理总是很好,但是这可能会导致锁定符合ACID的数据库?

我知道DynamoDB会很快处理这种用例,并且记录模式正好位于NoSQL小巷。我可以使用全局二级索引/本地二级索引来解决一些问题。我在使用Redshift时在PostgreSQL上有一些经验,但是我主要处理批量插入而无需修改数据。现在我需要数据修改方面。我认为RDS Postgres会很好,但是很想听听您的想法或意见。

P.S。不要太在意“订阅”系统的设计,这是我为类似要求设置示例时可以想到的最佳并行示例。:)

2 个答案:

答案 0 :(得分:1)

这是一个主观的问题,但从客观上讲,DynamoDB不是为扫描而设计的。它可以做到,但需要循环执行重复的请求,从最后一个中断的地方开始每个请求。对于大型数据集来说,这不是很快的事情,因此也有parallel scan,但您必须弄乱线程,并因此消耗大量表吞吐量。

另一方面,使用SDK对DynamoDB进行原型设计和测试很容易且便宜。

但是由于每天需要扫描数据以及潜在的联接需求,因此我强烈倾向于使用关系数据库。

答案 1 :(得分:0)

每天

每天处理25万行数据可能不足以使用 Amazon Redshift 。它具有数百万到数十亿行的最佳选择,通常在您要全天进行查询时使用。

如果 RDS数据库满足您的需求,那就去吧!如果您希望节省成本,则可以全天在Amazon S3中累积记录,然后每天只加载和处理一次数据,并在不需要时关闭数据库。 (或者甚至终止它并在第二天启动一个新的,因为似乎您不需要访问历史数据。)

Amazon Athena 甚至可以满足您的需求,从S3读取每日数据,甚至不需要持久数据库。