我试图加速拥有大数据存储PutMulti
调用(500个实体)的Google App Engine请求处理程序,方法是将其拆分为多个实体并运行并发goroutine以发送更小的{{1调用(每个100个实体)。
在此之前,当我在许多并发请求上测试处理程序时,我经常从我的PutMulti
调用中获取数据存储区错误Call error 11: Deadline exceeded (timeout)
。在并行化之后,处理程序确实加速了,但我偶尔也会遇到该错误以及另一种类型的错误PutMulti
。
由于数据存储区中的争用导致此错误5,错误5和11之间的区别是什么?
答案 0 :(得分:2)
这些错误来自两个不同的地方,第一个是调用错误,是由RPC客户端中的超时引起的本地错误。它表示存在等待RPC完成的超时。 google.golang.org/appengine中的默认RPC超时为60秒。
第二个错误来自服务方面。此错误表示在数据存储区中执行操作时发生超时。其中一些操作的超时时间远短于60秒,通常这可能表明存在争用。
理解差异的一种可能更简单的方法是,您会发现如果您使用大量更改进行单个多操作,则可以轻松触发第一个超时。如果针对单个键或一小组键创建大量并发操作,则更容易触发后者。由于超时是共享资源饱和的一般指标,因此生成它们的方法和组合当然有很多种。通常,人们希望适当地重试操作,并且还要适当地调整操作大小,以及尽可能地聚合热键上的操作以减少与争用相关的问题的机会。正如其他人所建议的那样,python和java文档已经有了一些例子。
您可能希望使用https://godoc.org/google.golang.org/appengine#IsTimeoutError,如果您需要增加第一个错误类的超时,您可以调整上下文截止时间,请参阅此处的方法:https://godoc.org/golang.org/x/net/context#WithDeadline注意:您将无法将截止日期延长到请求截止日期之后,但是,如果您在任务或虚拟机中运行,则可以延长到最后期限。
答案 1 :(得分:1)
您看到的第一个错误可能只是正常操作中的超时,第二个错误可能是因为写入争用。更多相关信息:处理数据存储区错误https://cloud.google.com/appengine/articles/handling_datastore_errors