这个问题已经发布在 AWS 论坛上,但仍未得到解答https://forums.aws.amazon.com/thread.jspa?threadID=94589
我正在尝试执行一长串短项目(大约 1.2 亿个)的初始上传,以便稍后通过唯一键检索它们,这似乎是 DynamoDb 的完美案例。
但是,我目前的写入速度非常慢(每 100 次写入大约需要 8-9 秒),这使得初始上传几乎不可能(按照目前的速度大约需要 3 个月)。
我已阅读 AWS 论坛以寻找答案,并且已经尝试了以下方法:
我从单个“put_item”调用切换到批量写入 25 个项目(推荐的最大批量写入大小),并且我的每个项目都小于 1Kb(这也是推荐的)。即使我的 25 个项目也低于 1Kb,这也是非常典型的,但不能保证(并且无论如何都应该无关紧要,因为我理解只有单个项目的大小对 DynamoDB 很重要)。
我使用最近引入的欧盟区域(我在英国)通过调用 set_region('dynamodb.eu-west-1.amazonaws.com') 直接指定其入口点,因为在 PHP 中显然没有其他方法可以做到这一点API。AWS 控制台显示该表位于适当的区域,因此可以正常工作。
我通过调用 disable_ssl() 禁用了 SSL(每 100 条记录获得 1 秒)。
尽管如此,一个包含 100 个项目的测试集(25 个项目的 4 批写入调用)的索引时间永远不会少于 8 秒。每个批量写入请求大约需要 2 秒,所以它不像第一个是即时的,随后的请求就会很慢。
我的表配置吞吐量是 100 个写入和 100 个读取单元,到目前为止应该足够了(也尝试了更高的限制以防万一,没有效果)。
我也知道请求序列化有一些费用,所以我可以使用队列来“累积”我的请求,但这对于 batch_writes 真的那么重要吗?而且我认为这不是问题,因为即使是单个请求也需要很长时间。
我发现有些人修改了 API 中的 cURL 标头(特别是“期望:”)以加快请求速度,但我认为这不是正确的方法,而且自从该建议发布以来,API 已经更新。
我的应用程序运行的服务器也很好 - 我读过有时 CPU 负载会飙升,但在我的情况下一切都很好,只是网络请求需要太长时间。
我现在被困住了 - 我还有什么可以尝试的吗?如果我没有提供足够的信息,请随时询问更多信息。
还有其他最近的线程,显然是关于同样的问题,here(虽然到目前为止还没有答案)。
这项服务应该是超快的,所以我一开始就对这个问题感到困惑。