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

PubSub转BigQuery订阅异常:消息入死信队列+时间解析错误

PubSub转BigQuery订阅问题排查

我创建了一个PubSub转BigQuery的订阅,配置了死信队列,相关Schema如下:

问题1对应的Schema

Avro Schema

{
  "namespace": "com.x.y.z.model",
  "name": "XYZDataPoint",
  "type" : "record",
  "fields" : [
    {
      "name" : "id",
      "type" : "string"
    },
    {
      "name" : "name",
      "type" : "string"
    },
    {
      "name" : "created_at",
      "type" : { "type": "long", "logicalType": "timestamp-micros" }
    }
  ]
}

BigQuery Schema

[
  {
    "name" : "id",
    "type" : "string",
    "mode" : "NULLABLE"
  },
  {
    "name" : "name",
    "type" : "string",
    "mode" : "NULLABLE"
  },
  {
    "name" : "created_at",
    "type": "TIMESTAMP",
    "mode" : "NULLABLE"
  }
]

问题1现象

发布消息后,消息直接进入死信队列,未同步到BigQuery。死信队列中的消息示例:

{"id":"dddckdkc416-49a9-4cdnac-aa48-b07d8ckdsnaac2","name":"INITIATED","created_at":1693435133390}

补充:正常同步的订阅Schema

我另有一个同类型的订阅可以正常同步,其Schema如下:

Avro Schema

{
  "namespace": "com.x.y.z.model",
  "name": "XYZStatusDataPoint",
  "type" : "record",
  "fields" : [
    {
      "name" : "id",
      "type" : "string"
    },
    {
      "name" : "status",
      "type" : "string"
    },
    {
      "name" : "xyz_status",
      "type" : "string"
    },
    {
      "name" : "date",
      "type" : { "type": "long", "logicalType": "timestamp-micros" }
    }
  ]
}

BigQuery Schema

[
  {
    "name" : "id",
    "type" : "string",
    "mode" : "NULLABLE"
  },
  {
    "name" : "status",
    "type" : "string",
    "mode" : "NULLABLE"
  },
  {
    "name" : "xyz_status",
    "type" : "string",
    "mode" : "NULLABLE"
  },
  {
    "name" : "date",
    "type" : "TIMESTAMP",
    "mode" : "NULLABLE"
  }
]

问题2现象

这个订阅的消息能同步到BigQuery,但date字段解析错误,显示为1970-01-20 14:23:55.133390 UTC。


问题1解决方案

核心原因是时间戳精度不匹配:Avro Schema定义created_at为timestamp-micros(微秒级,需16位数字),但实际发送的created_at值1693435133390是毫秒级(13位),不符合Schema校验规则,导致消息被拒收打入死信队列。

修复方式二选一:

  1. 调整生产者代码,将created_at转换为微秒级时间戳后发送;
  2. 修改Avro Schema的逻辑类型为timestamp-millis,匹配实际发送的精度:
{
  "name" : "created_at",
  "type" : { "type": "long", "logicalType": "timestamp-millis" }
}

问题2解决方案

同样是时间戳精度不匹配导致:Avro Schema按timestamp-micros解析,但生产者发送的是毫秒级时间戳,相当于把毫秒值当成了微秒,时间被缩小1000倍,因此显示为1970年初的错误时间。

修复方式二选一:

  1. 生产者发送时将时间戳转换为微秒级;
  2. 修改Avro Schema的date字段逻辑类型为timestamp-millis:
{
  "name" : "date",
  "type" : { "type": "long", "logicalType": "timestamp-millis" }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:55:56