6、生产者压缩算法面面观

2023-12-14 07:52

本文主要是介绍6、生产者压缩算法面面观,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

生产者压缩算法面面观

  • 1、怎么压缩?
  • 2、何时压缩?
    • 2.1、生产者端
    • 2.2、Broker 端
  • 3、何时解压缩?
  • 4、各种压缩算法对比

压缩的思想,实际就是用时间去换空间的经典 trade-off 思想,在 Kafka 中,就是用 CPU 时间去换磁盘空间或网络 I/O 传输量,希望以较小的 CPU 开销带来更少的磁盘占用或更少的网络 I/O 传输。

1、怎么压缩?

Kafka 的消息层次分为两层:消息集合(message set)以及消息(message)。一个消息集合中包含多条日志项(record item),而日志项才是真正封装消息的地方。Kafka 底层的消息日志由一系列消息集合日志项组成。

Kafka 的设计哲学是关注于消息集合这个层面,而不是直接操作单条消息。也就是说,生产者和消费者通常不会直接与单一的消息进行交互,而是以消息集合为单位进行写入和读取操作。例如,当生产者发送一批消息时,它们会被批量存储在相应的消息集合中;同样地,当消费者消费一批消息时,它也是一次从对应的消息集合中读取多条日志项。这种方式提高了数据处理的效率和并发性能。(linger.ms生产端可以通过这个参数来控制多长时间为一批次,默认是 0,即不等待)

CRC 校验工作:在消息集合这一层。无需对每条消息都做 CRC
压缩工作:对整个消息集合进行压缩。

2、何时压缩?

在 Kafka 中,压缩可能发生在两个地方:生产者端和 Broker 端。

2.1、生产者端

生产者程序中配置 compression.type 参数即表示启用指定类型的压缩算法。这样 Producer 启动后生产的每个消息集合都是经过指定压缩算法压缩过的,故而能很好地节省网络传输带宽以及 Kafka Broker 端的磁盘占用。

2.2、Broker 端

大部分情况下 Broker 从 Producer 端接收到消息后仅仅是原封不动地保存而不会对其进行任何修改。

但如下情况 Broker 端也可能进行压缩:
Broker 端指定了和 Producer 端不同的压缩算法

Broker 端也有一个参数叫 compression.type,若其指定了和 Producer 端不同的压缩算法,Broker 会将接收到的消息先解压缩,再按指定算法压缩。这会导致 Broker 端 CPU 使用率飙升。这个参数的默认值是 producer,表示 Broker 接收到消息后仅仅是原封不动地保存

3、何时解压缩?

有压缩必有解压缩!通常来说解压缩发生在消费者程序中,也就是说 Producer 发送压缩消息到 Broker 后,Broker 照单全收并原样保存起来。当 Consumer 程序请求这部分消息时,Broker 依然原样发送出去,当消息到达 Consumer 端后,由 Consumer 自行解压缩还原成之前的消息。

那么现在问题来了,Consumer 怎么知道这些消息是用何种压缩算法压缩的呢?其实答案就在消息中。Kafka 会将启用了哪种压缩算法封装进消息集合中,这样当 Consumer 读取到消息集合时,它自然就知道了这些消息使用的是哪种压缩算法。如果用一句话总结一下压缩和解压缩,那么我希望你记住这句话:Producer 端压缩、Broker 端保持、Consumer 端解压缩

4、各种压缩算法对比

看一个压缩算法的优劣,有两个重要的指标:

  • 压缩比,原先占 100 份空间的东西经压缩之后变成了占 20 份空间,那么压缩比就是 5,显然压缩比越高越好;
  • 压缩 / 解压缩吞吐量,比如每秒能压缩或解压缩多少 MB 的数据。同样地,吞吐量也是越高越好。
    在这里插入图片描述

从表中我们可以发现 zstd 算法有着最高的压缩比,而在吞吐量上的表现只能说中规中矩。反观 LZ4 算法,它在吞吐量方面则是毫无疑问的执牛耳者。当然对于表格中数据的权威性我不做过多解读,只想用它来说明一下当前各种压缩算法的大致表现。

在实际使用中,GZIP、Snappy、LZ4 甚至是 zstd 的表现各有千秋。但对于 Kafka 而言,它们的性能测试结果却出奇得一致,- 在吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;- 在压缩比方面,zstd > LZ4 > GZIP > Snappy。- 具体到物理资源,使用 Snappy 算法占用的网络带宽最多,zstd 最少,这是合理的,毕竟 zstd 就是要提供超高的压缩比;- 在 CPU 使用率方面,各个算法表现得差不多,只是在压缩时 Snappy 算法使用的 CPU 较多一些,而在解压缩时 GZIP 算法则可能使用更多的 CPU。

这篇关于6、生产者压缩算法面面观的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491739

相关文章

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

生产者消费者模型(能看懂文字就能明白系列)

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 前言 本节目标: 理解什么是阻塞队列,阻塞队列与普通队列的区别理解什么是生产者消费者模型生产者消费者模型的主要作用 一、阻塞队列 阻塞独立是一个特殊的队列,它具有以下特点: 线程安全带有阻塞特性:即如果队列为空,这时继续出队列的话,

三个同步与互斥问题之生产者与消费者

#include<stdio.h> #include<pthread.h> pthread_mutex_t  mutex; #define Max 10 pthread_cond_t pro; pthread_cond_t con; int buffer=0;//全局变量----一开始为0,只有生产者可以执行 void deal_produce(

编写一个生产者消费者模式的JAVA工程

编写一个生产者消费者模式的JAVA工程; 要求: 1)符合生产者消费者模式,避免出现资源访问冲突; 2)输出生产和消费的执行过程; 3)分别统计生产者和消费者的执行时长和等待时长(目前还不知道怎么搞,其他的参考http://blog.csdn.net/monkey_d_meng/article/details/6251879) 创建类Storage,作为仓库 import java.ut

算法:图片压缩算法【Z字行扫描】(Java实现)

要在Java中实现Z字形扫描,我们需要遍历一个给定的n×n矩阵,并按照Z字形的顺序输出其元素。Z字形扫描的路径通常是从矩阵的左上角开始,沿着对角线方向交替向下和向上移动,直到遍历完整个矩阵。 下面是一个简单的Java实现示例: import java.util.Scanner;public class ZigzagScan {public static void main(String

生产者-消费者,使用C++11的版本

前言 multi-threading以及lambda是C++11的重要升级,下面的经典的生产者-消费者的代码,既使用了C++11的multi-threading相关的库, 又使用了lambda。代码中有注释,应该比较详细。 Talk is cheap show me the code #include <iostream> #include <queue>#inc

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

消费者生产者模式(2)——用java阻塞队列实现

生产者——消费者模式有三个阶段的编程:     1.使用synchronized,wait,notify(这在我博客中已经有实现了,可以找找看看)      2.使用阻塞队列LinkedBlockingQueue(这是本小节的重点)      3.使用非阻塞式的内存结构如ConcurrentLinkedQueue(以后补充)      本小节所讨论的生产者消费者模式是通过一个容器来

生产者消费者模式sychronized实现 java

生产者消费者模式sychronized实现 java 相信大家都对消费者和生产者模式有一定了解,这个场景经常会用到多线程,而且因为涉及到共享资源的获取和修改,必然是需要线程同步的,那这边我就用synchronized来试下消费者和生产者,希望大家能看明白,程序中有注释,基本上能看懂的,主要是对共享对象buffer中的两个方法进行同步 代码: import java.util.Date;

图片压缩算法优化

正常的rgb三通道的图片用以下压缩算法没啥问题 def zip_img0(image_bytes):'''压缩图片 :param image_bytes::return:'''try:image_np = np.frombuffer(image_bytes, np.uint8)image = cv2.imdecode(image_np, cv2.IMREAD_COLOR)h, w, c = np