如何获取Google Pub/Sub压缩数据大小及发送前消息压缩尺寸?
获取Pub/Sub消息压缩后的大小
要在发送消息前计算PubsubMessage压缩后的大小,你可以手动模拟Publisher的压缩逻辑——因为只有当消息序列化后的原始大小超过你设置的compressionBytesThreshold时,Publisher才会启用压缩,且默认使用Gzip算法。具体步骤如下:
序列化消息并获取原始大小
先把PubsubMessage序列化为ByteString,得到它的原始字节大小:ByteString serializedMessage = pubsubMessage.toByteString(); int originalSize = serializedMessage.size();判断是否触发压缩并计算压缩后大小
如果原始大小超过你设置的阈值(100000L),就用Gzip算法手动压缩序列化后的字节,得到压缩后的大小;否则压缩后大小等于原始大小:long compressionThreshold = 100000L; long compressedSize = originalSize; if (originalSize > compressionThreshold) { try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzipOut = new GZIPOutputStream(baos)) { gzipOut.write(serializedMessage.toByteArray()); gzipOut.finish(); // 确保所有压缩数据都写入输出流 compressedSize = baos.size(); } catch (IOException e) { // 根据业务需求处理压缩异常,比如降级使用原始大小 e.printStackTrace(); } } // compressedSize 即为最终压缩后的大小 System.out.println("消息压缩后的大小: " + compressedSize + " 字节");
注意事项
- 如果你给Publisher配置了自定义压缩器(比如Snappy),需要替换对应的压缩实现,而不是Gzip。
- 这个计算结果是近似值,和Publisher内部的压缩实现可能存在微小差异,但足以满足大部分场景的需求。
内容的提问来源于stack exchange,提问作者user2930137
相关产品推荐
相关产品推荐

