【问题标题】:How to set timeout setting for python-firestore AsyncClient?如何为 python-firestore AsyncClient 设置超时设置?
【发布时间】:2021-12-20 23:03:02
【问题描述】:

我正在将 google.cloud.firestore 与 Async Client 一起使用,我想为添加文档添加超时设置,但我无法以某种方式...

版本

  • Python:3.9.7
  • google-cloud-firestore: ">=2.1.0"
  • API 框架:fastapi: "^0.70.0"
  • pytest: "^6.2.5"
  • pytest-asyncio: "^0.16.0"

问题

当我运行这段代码时without setting firebase server turning on:

from firebase_admin import firestore
db_client = firestore.AsyncClient()

async def some_function():
  await asyncio.wait_for(
    db.collection('states')
      .add({'some':'values'})
    ,timeout=10
  )

这应该会导致错误only after when 10 secs已经过去,但实际上这会导致错误immidiately说:

503 failed to connect to all addresses

如何修复db.collection('states').add(...) 以适当等待?

谢谢!

【问题讨论】:

  • 您能否确认代码“db.collection('states').add(...)” 是否有效,而无需将其包装在 asyncio 超时设置周围。

标签: python google-cloud-firestore python-asyncio fastapi pytest-asyncio


【解决方案1】:

首先,您应该检查是否有任何网络设置阻止连接。 503 表示库无法与后端 API 建立连接。现在来到 Firestore 超时值,没有办法调整它。超时请求默认为根据this 指定的系统值。

写操作永远不会超时,也永远不会因网络丢失而失败。您不应将 Firestore 读取和写入视为典型的输入和输出操作。写入 Firestore 的数据最终会同步,只要有可能就会同步。

与在 Firebase 实时数据库中启用离线持久性不同,您必须执行以下操作:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

在 Cloud Firestore 中,默认情况下会启用离线持久性。所以,没有必要使用:setPersistenceEnabled(true)。当您离线时,结果将来自您的应用正在使用的 Cloud Firestore 数据的缓存副本。要检查数据是来自缓存还是来自 Firestore 服务器,您可以使用以下代码行:

String source = querySnapshot.getMetadata().isFromCache() ? "Local Cache" : "Firebase Servers”

在 Firestore 中编写的文档如果不执行会立即保存在本地,直到它们能够与服务器同步,这可能是将来的任何时间。

// 使用生成的 id 添加一个新文档。

Map<String, Object> data = new HashMap<>(); 
data.put("name", "Tokyo"); 
data.put("country", "Japan"); 
db.collection("cities") .add(data) .addOnSuccessListener(
new OnSuccessListener<DocumentReference>() { 
@Override public void onSuccess(DocumentReference documentReference) 
{ Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId()); 
} })
 .addOnFailureListener(new OnFailureListener() { 
@Override public void onFailure(@NonNull Exception e) 
{ Log.w(TAG, "Error adding document", e); 
} });

注意:只有在与服务器建立连接时才会调用 onSuccess 或 onFailure。唯一的例外是事务操作,它需要网络来完成。

但是,Firestore 的 Python 客户端库中有一个 request 要求进行此改进。也可以看看这个reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多