接口传输的内容过长,有哪些压缩方式?
1、问题背景
前段时间,开发完某产品的需求后,后端调用离线大数据任务平台时总会出现一些失败的任务,经过评查及采样发现失败的任务都有一个共同点:请求大数据平台接口的参数长度大于64 kb,经过与大数据任务平台侧团队沟通排查后,确认是请求参数长度超过限制,导致插入数据库时报错异常,临时的解决方案是拓展数据库字段长度,但字段长度总不能一直扩展,因此需要业务调用方对请求参数的长度做限制或者压缩处理,使之能满足接口的使用要求。
2、东寻西觅
-
ZIP压缩
1public class CompressUtils { 2 3 private static final Logger logger = LoggerFactory.getLogger(CompressUtils.class); 4 5 /** 6 * 压缩 7 * 8 * @param data 待压缩数据 9 * @return byte[] 压缩后的数据 10 */ 11 public static byte[] compress(byte[] data) { 12 Deflater deflater = new Deflater(); 13 deflater.reset(); 14 deflater.setInput(data); 15 deflater.finish(); 16 byte[] output; 17 try(ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length)) { 18 byte[] buf = new byte[1024]; 19 while (!deflater.finished()) { 20 int i = deflater.deflate(buf); 21 bos.write(buf, 0, i); 22 } 23 output = bos.toByteArray(); 24 } catch (Exception e) { 25 logger.error("压缩内容异常", e); 26 throw new RuntimeException(e); 27 } 28 deflater.end(); 29 return output; 30 } 31 32 /** 33 * 解压缩 34 * 35 * @param data 待压缩的数据 36 * @return byte[] 解压缩后的数据 37 */ 38 public static byte[] decompress(byte[] data) { 39 40 Inflater inflater = new Inflater(); 41 inflater.reset(); 42 inflater.setInput(data); 43 44 byte[] output; 45 try (ByteArrayOutputStream o = new ByteArrayOutputStream(data.length)) { 46 byte[] buf = new byte[1024]; 47 while (!inflater.finished()) { 48 int i = inflater.inflate(buf); 49 o.write(buf, 0, i); 50 } 51 output = o.toByteArray(); 52 } catch (Exception e) { 53 logger.error("解压内容异常", e); 54 throw new RuntimeException(e); 55 } 56 57 inflater.end(); 58 return output; 59 } 60}
压缩后数据大小从 66627 降为 3657,大小减少了 95%,从该数据来看,效果还是不错的。
3、归纳总结
不管是在接口请求参数上,还是其他应用场景,均可通过压缩、解压缩的方式减少数据存储的空间,达到降本的效果。除此之外,还可以减少网络带宽及传输量,提高性能。