为什么google bigquery api会返回400而不是500状态代码?

时间:2016-12-13 20:15:12

标签: google-bigquery

为什么以下google bigquery api会拨打400" Bad Request"而不是500(或更具体地说是503)?我通常不会重试400,因为它意味着我的请求有问题,但是当我查看错误消息中的描述时,它看起来像是服务器端的临时错误。此外,当我重试时,响应成功。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "The job encountered an error during execution. Retrying the job may solve the problem.",
    "reason" : "jobBackendError"
  } ],
  "message" : "The job encountered an error during execution. Retrying the job may solve the problem."
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)

我排除了剩余的专有堆栈跟踪,但代码如下所示,其中SQL很简单 - > "从project.ds.table订单中选择* 1"

QueryRequest request = new QueryRequest().setQuery(queryString).setUseLegacySql(false).setTimeoutMs(1l);

QueryResponse resp = bq.jobs().query(projectId, request)
        .execute();

根据Big Query Docs https://cloud.google.com/bigquery/troubleshooting-errors和普通的HTTP约定。我认为它应该是500或503。

backendError    500 or 503  This error returns when there is a temporary server failure such as a network connection problem or a server overload.

1 个答案:

答案 0 :(得分:1)

我在生产中发现了同样的问题,偶尔会出现此HTTP 400错误消息。 Python库将其作为BadRequest异常引发。 这种异常很少出现,并且只有在负载很重的情况下(许多并发查询同时运行)。

问题在官方Python BigQuery客户端回购的this GitHub issue中进行了描述。出于以下动机,创建了一个内部Google问题并将其关闭是不可能的:

连接错误是作为作业结果返回的唯一可重试错误,因此,如果Jobs.getQueryResult()返回400并且错误原因设置为“ jobBackendError”,则只需添加逻辑即可重试job.insert()。这意味着该作业因连接错误而失败),但我认为您无法在这种情况下重复使用该作业ID。

我在Google支持上有一张目前开放的票证,要求他们将HTTP状态代码更改为500,或者至少以jobBackendError的理由error table进行记录。

作为一种临时解决方法,您可以捕获所有HTTP 400异常,仅重试具有jobBackendErrorbackendErrorinternalError原因的异常,然后重新引发其他异常。