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

Pub/Sub Emulator使用通用Proto Buffer库收发二进制消息失效问题咨询

问题根因

你的消费逻辑依赖了仅当Pub/Sub Topic绑定Schema时才会由云端服务端自动注入的googclient_schemaencoding属性,而Pub/Sub模拟器不支持Schema相关能力,不会自动添加该属性,导致代码直接跳出switch分支,没有执行Proto二进制反序列化步骤,看起来就像功能失效。

Pub/Sub模拟器的Schema限制仅指不支持服务端的Schema绑定、校验、自动注入属性等能力,完全支持传递任意二进制字节流,你可以在本地自行实现Proto的序列化/反序列化,不需要依赖服务端Schema能力。


解决方案

方案1:移除不必要的编码判断逻辑(推荐,符合你仅使用Proto二进制的需求)

直接对收到的ByteString执行反序列化即可,修改消费端MessageReceiver逻辑:

MessageReceiver receiver =
    (PubsubMessage message, AckReplyConsumer consumer) -> {
      ByteString data = message.getData();
      try {
        OnfidoVerificationEvent state = OnfidoVerificationEvent.parseFrom(data);
        System.out.println("Received proto message: " + state);
      } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
      }
      consumer.ack();
      System.out.println("Ack'ed the message");
    };

方案2:兼容原有逻辑,发布时手动添加编码属性

如果你需要保留原有编码判断逻辑同时兼容模拟器,只需要在发布消息时手动添加对应属性即可,修改publishProtoMessageTest方法中的消息构建逻辑:

PubsubMessage.Builder message = PubsubMessage.newBuilder();
message.setData(onfidoVerificationEvent.toByteString());
// 手动添加编码属性,兼容原有判断逻辑
message.putAttributes("googclient_schemaencoding", "BINARY");
System.out.println("Publishing a BINARY-formatted message:\n" + message);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:18:03