这个问题已经发布在AWS论坛上,但仍未得到解答https://forums.aws.amazon.com/thread.jspa?threadID=94589 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 标头(特别是“Expect:”)以加快请求速度,但我认为这不是正确的方法,而且自该建议发布以来 API 也已更新。
我的应用程序运行的服务器也很好 - 我读到有时 CPU 负载会达到极限,但就我而言,一切都很好,只是网络请求花费了太长时间。
我现在陷入困境 - 还有什么我可以尝试的吗?如果我没有提供足够的信息,请随时询问更多信息。
最近还有其他线程,显然是关于同一问题的,here https://forums.aws.amazon.com/thread.jspa?messageID=341508(但到目前为止还没有答案)。
这项服务应该是超快的,所以我一开始就对这个问题感到困惑。