如何在Rust中发起gRPC Firestore监听请求?收不到返回怎么解决?
问题原因分析
你遇到的无返回问题主要来自两个核心错误配置:
- Firestore的
Listen接口是双向流式gRPC接口,你用stream::iter(vec![req])构造的请求流是一次性的,发送完初始监听请求后流就会结束,客户端主动关闭发送方向的连接,服务端检测到发送流关闭后就会返回NO_ERROR的GoAway帧断开整个连接,自然不会推送后续的变更数据。 - 你用了
DocumentsTarget来监听集合,这个类型仅用于监听指定的单个/多个文档,传入集合路径时服务端无法匹配到任何监听目标,就算连接存活也不会返回数据。
解决步骤
- 调整请求流构造,保证发送流不会主动关闭:如果暂时不需要发送后续的控制请求(比如停止监听、切换目标),可以将初始请求流和永久pending的流合并,示例如下:
// 先构造初始请求 let init_req = /* 你的原有ListenRequest */; // 构造永不关闭的发送流 let req_stream = stream::once(future::ready(init_req)).chain(stream::pending()); let mut req = Request::new(req_stream);
- 修正监听目标类型:如果要监听整个
users集合的变更,将TargetType替换为QueryTarget,示例代码如下:
target_type: Some(TargetType::Query(QueryTarget { parent: format!("projects/{}/databases/(default)/documents", project_id), query: Some(StructuredQuery { from: vec![structured_query::CollectionSelector { collection_id: "users".to_string(), all_descendants: false, }], // 其余字段按需配置,不需要过滤的话留默认即可 ..Default::default() }), })),
- 校验参数一致性:确认
google-cloud-resource-prefix请求头的值和ListenRequest中的database字段值完全一致,避免路径不匹配导致服务端静默忽略请求。 - 开启全量日志排查:如果修改后还是无返回,将gRPC库的日志级别调整到trace,检查是否有遗漏的权限错误、参数错误响应帧。
内容的提问来源于stack exchange,提问作者robertkrahn
相关产品推荐
相关产品推荐

