我正在尝试通过将一个大型数据存储PutMulti调用(500个实体)拆分成多个实体并运行并发goroutines来发送较小的PutMulti调用(每个100个实体)来加快Google App Engine请求处理程序的速度。
在此之前,当我在许多并发请求上测试处理程序时,我经常会从PutMulti调用中得到超过截止日期的数据存储错误Call error 11: Deadline exceeded (timeout)。在并行化之后,处理程序确实加快了速度,但我仍然偶尔会遇到该错误以及另一种类型的错误,API error 5 (datastore_v3: TIMEOUT): The datastore operation timed out, or the data was temporarily unavailable。
此错误5是否由数据存储区中的争用引起,错误5和错误11之间的区别是什么?
发布于 2016-04-04 06:12:50
这些错误来自两个不同的地方,第一个是调用错误,它是由RPC客户端中的超时引起的本地错误。它指示存在等待完成RPC的超时。google.golang.org/appengine中的默认RPC超时是60秒。
第二个错误来自服务端。此错误指示在数据存储区内执行操作时发生超时。其中一些操作的超时时间比60s短得多,通常这可能表示争用。
理解差异的一种可能更简单的方法是,您会发现,如果您进行单个多操作并进行了大量更改,则可以轻松地触发第一个超时。如果您针对单个键或一小组键创建大量并发操作,则更容易触发后者。由于超时是共享资源饱和的一般指标,因此当然有许多方法和组合来生成它们。通常,人们会希望在适当的时候重试操作,并且适当地调整操作的大小,以及尽可能地聚合热键上的操作,以减少与争用相关的问题的机会。正如其他人所建议的那样,python和java文档已经提供了一些这样的例子。
您可能希望使用https://godoc.org/google.golang.org/appengine#IsTimeoutError,如果需要增加第一个错误类的超时,您可以调整上下文截止日期,请参阅此处的方法:https://godoc.org/golang.org/x/net/context#WithDeadline注意:您将不能将截止日期延长到请求截止日期之外,但是,如果您在任务或虚拟机中运行,则可以延长到较长的截止日期。
发布于 2016-02-07 13:11:24
您看到的第一个错误可能是正常操作中的超时,第二个错误可能是因为写争用。更多信息: Handling Datastore Errors https://cloud.google.com/appengine/articles/handling_datastore_errors
https://stackoverflow.com/questions/34907909
复制相似问题