出于性能原因,我在我的 GAE 应用程序中使用了分片计数器 ( https://cloud.google.com/appengine/articles/sharding_counters ),但我在理解它为什么这么慢以及如何加快速度时遇到了一些麻烦.
背景
我有一个 API,它一次抓取一组 20 个对象,对于每个对象,它从计数器中获取总数以包含在响应中。
指标
打开 Appstats 并清除缓存后,我注意到通过 datastore_v3.Get 获取 20 个计数器的总数会产生 120 个 RPC,这需要 2500 毫秒。
想法
这似乎是相当多的 RPC 调用,而且仅读取 20 个计数器就需要相当多的时间。我认为这会更快,也许这就是我错的地方。它应该比这更快吗?
进一步检查
我深入研究了统计数据,查看了 get_count 方法中的这两行:
all_keys = GeneralCounterShardConfig.all_keys(name)
for counter in ndb.get_multi(all_keys):
如果我注释掉 get_multi 行,我会看到 datastore_v3 有 20 个 RPC 调用。Get 总计 185 毫秒。
正如预期的那样,这使得 get_multi 成为 datastore_v3 100 次 RPC 调用的罪魁祸首。获得超过 2500 毫秒的时间。我验证了这一点,但这就是我感到困惑的地方。为什么用 20 个键调用 get_multi 会导致 100 次 RPC 调用?
更新 #1
我在 GAE 控制台中检查了 Traces 并看到了一些附加信息。他们在那里也显示了 RPC 调用的细分 - 但在他们所说的“批量获取以减少远程过程调用的数量”的情况下。不知道如何在使用 get_multi 之外做到这一点。认为那完成了工作。这里有什么建议吗?
更新 #2
以下是一些屏幕截图,显示了我正在查看的统计数据。第一个是我的基线 - 没有任何计数器操作的功能。第二个是在为一个计数器调用 get_count 之后。这显示了 6 个 datastore_v3.Get RPC 的差异。