RocketMQ支持哪些消息压缩算法?

RocketMQ支持多种消息体压缩算法,主要有:

  • NONE:不压缩,这是默认选项。
  • GZIP:GZIP压缩算法,较高压缩率但压缩速度较慢。
  • LZ4:LZ4压缩算法,压缩率适中但压缩速度很快。
  • ZSTDD:ZSTD压缩算法,新一代压缩算法,既能达到较高压缩率又保证较快压缩速度。

消息体压缩主要依赖JDK提供的GZIPOutputStream与ByteArrayInputStream来实现。主要涉及的对象有:

  • CompressHelper:压缩助手类,用于实现不同压缩算法对消息体的压缩与解压。
  • MQClientAPIImpl:生产者客户端实现,用于判断消息是否需要压缩与压缩消息体。
  • DefaultLiteMQConsumerImpl:消费者实现,用于判断消息是否压缩过与解压消息体。
  • MessageAccessor:消息访问器,用于设置消息压缩标识与获取压缩后的消息体。

消息体压缩的主要流程:

  1. 生产者在发送消息前,会判断是否需要开启消息压缩以及判断所选压缩算法。
  2. 如果需要压缩,生产者会使用CompressHelper根据选择的算法压缩消息体。
  3. 生产者使用MessageAccessor设置消息头中的压缩标识与压缩后的消息体。
  4. Broker在接收消息后,会根据消息头中的压缩标识判断消息是否压缩。如果是,会存储压缩后的消息体。
  5. 消费者消费消息时,会根据消息头中的压缩标识判断消息是否压缩。如果是,会使用CompressHelper解压消息体。
  6. 解压成功后,消费者消费解压后的消息体。

启用消息体压缩可以带来以下好处:

  • 减少消息体存储大小与网络传输负载。
  • 提高消息发送与消费吞吐量。
    但是,消息体压缩也会带来一定的CPU计算压力与消息延迟。