使用更多线程
我建议将您的线程/域比率从 1/6 反转到接近 30/1 的值。从 SimpleDB 中提取大量数据所花费的大部分时间都将花在等待上。在这种情况下,增加线程数将大大提高您的吞吐量。
SimpleDB 的限制之一是查询响应大小上限为 1MB。这意味着在单个域中拉下 50MB 将至少需要 50 个选择(原始 + 49 个附加页面)。这些必须按顺序发生,因为下一个请求需要来自当前响应的 NextToken。如果每个 Select 需要 2 秒以上(在大响应和高请求量中并不罕见),那么您在每个域上花费 2 分钟。如果每个线程都必须依次遍历 6 个域中的每一个,那么大约需要 12 分钟。每个域一个线程应该可以轻松地将其缩短到大约 2 分钟。
但是你应该能够做得比这更好。SimpleDB 针对并发进行了优化。我会尝试每个域 30 个线程,给每个线程一个小时的一部分时间来查询,因为它毕竟是日志数据。例如:
SELECT * FROM domain WHERE timestamp between '12:00' and '12:02'
(显然,您将使用真正的时间戳值)所有 30 个查询都可以在不等待任何响应的情况下启动。通过这种方式,您仍然需要对每个域进行至少 50 次查询,但不是按顺序进行所有查询,您可以获得更多的并发性。您必须自己测试有多少线程可以为您提供最佳吞吐量。我鼓励您尝试每个域最多 60 个,将 Select 条件分解为一分钟增量。如果它对您有用,那么您将拥有完全并行的查询,并且很可能已经消除了所有后续页面。如果您收到 503 ServiceUnavailable 错误,请缩减线程。
域是 SimpleDB 可伸缩性的基本单位,因此最好有一种方便的方式来对数据进行分区。您只需要利用并发性。如果您能够在 13 秒内获取在同一区域的 EC2 上运行的应用程序的数据,而不是 13 分钟,我不会感到惊讶。但实际花费的时间将取决于许多其他因素。
成本问题
作为旁注,我应该提到你正在做的事情的成本,即使你没有提出这个问题。CreateDomain 和 DeleteDomain 是重量级操作。通常我不建议经常使用它们。每次您需要支付大约 25 秒的盒子使用时间,因此每小时创建和删除一个盒子的费用总计约为每月 70 美元,仅用于域管理。您可以在域中存储比您提到的 50MB 多数量级的数据。因此,您可能希望在删除之前让数据积累更多。如果您的查询包含时间戳(或可以包含时间戳),则在域中拥有额外 GB 的旧数据可能不会损害查询性能。在任何情况下,GetAttributes 和 PutAttributes 永远不会受到大域大小的性能影响,只有查询不会' t 充分利用选择性索引。您必须测试您的查询才能看到。这只是一个建议,我意识到创建/删除在概念上更清晰。
由于盒子使用公式中的一个怪癖,一次写入 200 个属性也很昂贵。写入的框使用量与属性数量的 3 次方成正比!以小时为单位的公式是:
0.0000219907 + 0.0000000002 N^3
对于基本费用加上每个属性费用,其中 N 是属性数。在您的情况下,如果您在一个请求中写入所有 200 个属性,则盒子使用费约为每百万个项目 250 美元(如果您写入 256 个属性,则为每百万个 470 美元)。如果您将每个请求分成 4 个请求,每个请求包含 50 个属性,您的 PutAttributes 量将增加四倍,但将盒子使用费降低一个数量级,降低到每百万个项目约 28 美元。如果您能够分解请求,那么它可能是值得的。如果你不能(由于请求量,或者只是你的应用程序的性质),这意味着从成本的角度来看,SimpleDB 最终可能会非常没有吸引力。