接口传输的内容过长,有哪些压缩方式?


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%,从该数据来看,效果还是不错的。

    image-20230613163349485

3、归纳总结

不管是在接口请求参数上,还是其他应用场景,均可通过压缩、解压缩的方式减少数据存储的空间,达到降本的效果。除此之外,还可以减少网络带宽及传输量,提高性能。