Google app engine 除了批处理,还有什么方法可以优化对谷歌应用程序引擎的多个put调用?

Google app engine 除了批处理,还有什么方法可以优化对谷歌应用程序引擎的多个put调用?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我在地图中为数据存储中的每个用户保存消息。它被保存为由唯一名称键入的未索引序列化值。一个用户可以同时向多个用户发送消息。目前,我为(例如)20个目标执行批处理get,更新每个目标中的序列化值,然后执行批处理put。序列化的消息大小小到不重要,大约1KB 这对于用户来说很快,appstats中显示的实时时间是90毫秒。但是,cpu时间成本为918ms。这会导致警告,并且在高使用率下可能会变得昂贵,或者如果我希望向50个用户发送消息,则会导致问题。有没有办法通过数据存储调整或对我错过的体系结构进行明

我在地图中为数据存储中的每个用户保存消息。它被保存为由唯一名称键入的未索引序列化值。一个用户可以同时向多个用户发送消息。目前,我为(例如)20个目标执行批处理get,更新每个目标中的序列化值,然后执行批处理put。序列化的消息大小小到不重要,大约1KB

这对于用户来说很快,appstats中显示的实时时间是90毫秒。但是,cpu时间成本为918ms。这会导致警告,并且在高使用率下可能会变得昂贵,或者如果我希望向50个用户发送消息,则会导致问题。有没有办法通过数据存储调整或对我错过的体系结构进行明显的更改来降低cpu时间成本?任务队列解决方案将删除警告,但实际上只会重新分配成本


编辑:数据存储键是接收者的用户名,值是存储为序列化映射的消息,其中键是发送者的用户名,消息是包含两个整数的简单对象。有两种类型的请求。上面描述的“更新”类型,其中检索消息映射,将新消息添加到映射,并存储映射。“get”类型是收件箱所有者读取消息,这是一个基于键的简单get。我的想法是,即使将其拆分为多值关系或类似关系,这也会提高保真度(允许同时进行两次更新),但如果采用简单的键值方法,则投入的工作量仍然是相同的。

听起来您已经相当有效地完成了工作。你不可能大幅度地减少这种情况。无论如何,每个请求少于1000 cpu毫秒是一个相当合理的数量


通过拆分实体,您可以获得两个好处:如果列表很长,那么在只需要读取或修改一小部分实体时,您可以节省读取和写入大型实体的CPU成本,并且可以节省事务冲突。也就是说,如果多个任务需要同时向队列中添加项目,则无需事务重试即可完成,从而节省了CPU时间。

听起来您已经相当高效地完成了任务。你不可能大幅度地减少这种情况。无论如何,每个请求少于1000 cpu毫秒是一个相当合理的数量


通过拆分实体,您可以获得两个好处:如果列表很长,那么在只需要读取或修改一小部分实体时,您可以节省读取和写入大型实体的CPU成本,并且可以节省事务冲突。也就是说,如果多个任务需要同时将项目添加到队列中,则无需事务重试即可完成此操作,从而节省CPU时间。

要查询的字段是否定义了索引?如果没有更多详细信息,则无法回答此问题。您在消息队列中存储了什么?它的格式是什么?您需要如何访问它?@Travis没有指定索引,因为我只是按键获取/放置。您需要显示代码。简单的密钥查询不应使用10倍的cpu-ms@Nick更新问题以回答问题您正在查询的字段是否定义了索引?如果没有更多详细信息,无法回答此问题。您在消息队列中存储了什么?它的格式是什么?您需要如何访问它?@Travis没有指定索引,因为我只是按键获取/放置。您需要显示代码。简单的密钥查询不应使用10倍的cpu-ms@Nick更新问题以回答问题