如何将base64字符串拆分为1MB以下分片用于AWS Kinesis Put Stream API
base64数据分片传输实现方案
完全可以实现,核心需要注意base64的编码特性,避免分片后解码失败,以下是可直接落地的算法逻辑:
方案1:先分片原始二进制再转base64(更推荐)
这个方案出错概率最低,不需要额外处理base64的对齐问题:
- 第一步:先对原始Blob数据做分片,单分片大小取 768KB 即可,因为base64编码后体积会膨胀1/3,768KB原始数据转base64刚好是 768 * 4/3 = 1024KB = 1MB,刚好满足Kinesis单分片不超过1MB的要求
- 第二步:按固定偏移量切割Blob,JS环境代码示例:
const CHUNK_SIZE = 768 * 1024; // 768KB原始二进制 const blobChunks = []; let offset = 0; while (offset < originalBlob.size) { const chunk = originalBlob.slice(offset, offset + CHUNK_SIZE); blobChunks.push(chunk); offset += CHUNK_SIZE; }
- 第三步:将每个Blob分片单独转成base64编码,同时给每个分片附加序号、总分片数标识,方便接收端按顺序拼接后解码
- 第四步:建议预留10KB左右的冗余空间,避免附加的分片元数据导致单条记录总大小超出1MB限制
方案2:直接对已生成的完整base64字符串分片
如果已经提前生成了完整的base64数据,不想回头处理原始Blob,可以用这个方案,但是要注意base64的4字节对齐规则:
- base64编码后的字符串长度一定是4的倍数,末尾最多有2个
=补位符,直接切割时要保证除了最后一个分片之外,其他分片的长度是4的倍数,否则接收端单独解码当前分片会出错 - 单分片的base64字符串长度控制在 1024 * 1024 字节以内,也就是1MB,1048576本身就是4的倍数,直接按这个长度切割即可
- 最后一个分片如果长度不足4的倍数,保留末尾的
=补位符即可 - 同样需要给每个分片附加序号、总分片数标识,方便接收端拼接
Kinesis的单条记录最大大小为1MB,分片时建议预留50KB左右的冗余空间,避免附加的分片元数据导致总大小超出限制
接收端拿到所有分片后,先按序号排序,把所有base64字符串拼接后再统一解码,不需要单独解码每个分片,这样可以跳过对齐校验的步骤,更稳妥
内容的提问来源于stack exchange,提问作者Muhammad Umair
相关产品推荐
相关产品推荐

