【问题标题】:Why does Datastore produce Timeout while fetching URL?为什么 Datastore 在获取 URL 时会产生超时?
【发布时间】:2016-12-22 15:20:12
【问题描述】:

今天有一小段时间,我使用 Google Cloud Datastore API 在灵活环境“兼容”中运行的代码遇到 java.net.SocketTimeoutException: Timeout while fetching URL 在将项目插入另一个 GAE 中的数据存储区时项目。

另外,Dataflow当时未能插入Items;几乎可以肯定同样的问题。

这也发生在简单的key查询上,所以不是数据量大的问题。

在此之前和之后,确实正确插入了许多其他数据;包括重新运行相同的数据。

谷歌搜索该错误表明它可能是由 Google Cloud 中的停机时间引起的,但 Google Cloud 状态仪表板显示为绿色。

这是什么原因造成的?以后如何避免呢?

com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities run: ERROR in CopyEntities(commerceDocs/RFQ) java.lang.RuntimeException: com.google.cloud.datastore.DatastoreException: I/O error at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.retryIfAllowed(GCloudApiDSBackup.java:963) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:857) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.retryIfAllowed(GCloudApiDSBackup.java:959) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:857) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntitiesByParts(GCloudApiDSBackup.java:991) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.run(GCloudApiDSBackup.java:801) at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at 
java.util.concurrent.FutureTask.run(FutureTask.java:266) at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at 
java.lang.Thread.run(Thread.java:745) Caused by: com.google.cloud.datastore.DatastoreException: I/O error at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.translate(DefaultDatastoreRpc.java:105) at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.commit(DefaultDatastoreRpc.java:133) at 
com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:390) at 
com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:387) at 
com.google.cloud.RetryHelper.doRetry(RetryHelper.java:179) at 
com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244) at 
com.google.cloud.datastore.DatastoreImpl.commit(DatastoreImpl.java:386) at 
com.google.cloud.datastore.DatastoreImpl.commitMutation(DatastoreImpl.java:380) at 
com.google.cloud.datastore.DatastoreImpl.put(DatastoreImpl.java:340) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:836) ... 9 more Caused by: com.google.datastore.v1.client.DatastoreException: I/O error, code=UNAVAILABLE at 
com.google.datastore.v1.client.RemoteRpc.makeException(RemoteRpc.java:126) at 
com.google.datastore.v1.client.RemoteRpc.call(RemoteRpc.java:95) at 
com.google.datastore.v1.client.Datastore.commit(Datastore.java:84) at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.commit(DefaultDatastoreRpc.java:131) ... 17 more Caused by: java.net.SocketTimeoutException: Timeout while fetching URL: https://datastore.googleapis.com/v1/projects/freightos-prod-backup2:commit at 
com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:173) at 
com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:45) at 
com.google.api.client.extensions.appengine.http.UrlFetchRequest.execute(UrlFetchRequest.java:74) at 
com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981) at 
com.google.datastore.v1.client.RemoteRpc.call(RemoteRpc.java:87) ... 19 more

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore app-engine-flexible


    【解决方案1】:

    看起来UrlFetchTransport 不应该被使用。

    我已提交 this issue 以修复 google-cloud-java 库。

    同时,您应该能够在构造DatastoreOptions 对象时强制它使用NetHttpTransport

    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.auth.http.HttpTransportFactory;
    
    DatastoreOptions.newBuilder()
        .setHttpTransportFactory(new HttpTransportFactory() {
          @Override
          public HttpTransport create() {
            return new NetHttpTransport();
          }
        })
        ...
    

    【讨论】:

    • 我正在使用 com.google.cloudgcloud-java-datastore0.2.8 但显然这两个 Maven而是需要依赖项。 com.google.cloudgoogle-cloud0.8.0 ...和... com.google.auth google-auth-library-oauth2-http0.6.0 对吗?
    • 有了这些库,代码就可以编译了。我更改了不推荐使用的方法。 (有关格式化代码和堆栈跟踪,请参阅pastebin.com/eZNmYmWw。)我得到 java.lang.NoSuchMethodError: com.google.datastore.v1.Entity.getPropertiesMap()Ljava/util/Map;在此代码: QueryResults results = datastore.run(query); while (results.hasNext()) {...
    • 在类路径中是否有可能还有一个旧版本的datastore-v1-protosgetPropertiesMap() 方法已添加到 1.2.0 中(因此不会出现在 1.0.01.0.1 中)。
    • 数据存储正在使用中。改组依赖项以避免这种冲突会产生此错误,从而阻止使用 com.google.cloud.dataflow.sdk.transform.DoFn。 "com.google.protobuf.GeneratedMessageV3$Builder 类型无法解析。它是从所需的 .class 文件中间接引用的"
    • 似乎其中一个库的旧版本仍在类路径中。您可能需要尝试使用dependencyManagement 部分来强制使用com.google.protobuf:protobuf-java:jar:3.0.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多