You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin/Ktor+Cloud Run解析Firestore Eventarc Protobuf负载失败排查

问题描述

我在Google Cloud Run上部署了一个Kotlin/Ktor镜像,代码用于接收Firestore Eventarc事件并解析Protobuf负载。已通过gcloud命令配置好Eventarc触发器,可成功触发并接收事件,但解析时出现两个问题:

  1. 尝试接收ByteArray并调用DocumentEventData.parseFrom解析时,抛出com.google.protobuf.InvalidProtocolBufferException: Protocol message had invalid UTF-8错误;
  2. 尝试直接接收DocumentEventData类型(已安装protobuf序列化插件),则报错kotlinx.serialization.SerializationException: Serializer for class 'DocumentEventData' is not found。

写入Firestore的数据是无特殊字符的简单JSON对象,请问问题出在哪里?


问题分析与解决

第一个错误:UTF-8格式异常

Eventarc发送的Firestore事件并非原始Protobuf二进制流,而是包裹在JSON结构里的Base64编码字符串。你直接将请求体当作ByteArray解析,相当于把JSON的UTF-8字节当作Protobuf二进制处理,必然触发格式错误。

正确处理步骤:

  1. 先将请求体解析为JSON对象,提取data字段的值(这是Base64编码字符串);
  2. 把该Base64字符串解码为ByteArray;
  3. 再用DocumentEventData.parseFrom(解码后的ByteArray)解析Protobuf。

示例代码片段:

// 用Kotlinx Serialization定义外层JSON结构
@Serializable
data class EventarcEnvelope(val data: String)

// Ktor路由处理逻辑
post("/webhook") {
    val envelope = call.receive<EventarcEnvelope>()
    val protoBytes = Base64.getDecoder().decode(envelope.data)
    val eventData = DocumentEventData.parseFrom(protoBytes)
    // 后续业务处理
}

第二个错误:找不到Serializer

Kotlinx Serialization不会自动为Protobuf生成的类创建序列化器,你安装的protobuf插件仅负责编译.proto文件生成Kotlin类,和Kotlinx Serialization的序列化逻辑无关。

如果想直接接收DocumentEventData,不能依赖Kotlinx Serialization的自动解析,要么按第一个错误的步骤先处理JSON再解码Protobuf,要么自定义Ktor的ContentConverter来适配Protobuf解析逻辑。

另外要确认:生成的DocumentEventData类是否正确引入了com.google.protobuf:protobuf-kotlin依赖,确保类本身编译正常。

额外检查点

  • 确认Eventarc触发器的事件类型配置正确,比如使用google.cloud.firestore.document.v1.written这类对应Firestore操作的类型;
  • 验证Cloud Run服务权限(你已能触发事件,这部分大概率没问题,但如果后续仍有异常可排查)。

内容的提问来源于stack exchange,提问作者Mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:33:15