Kafka 高并发设计之数据压缩与批量消息处理

《Kafka 高性能架构设计 7 大秘诀》专栏第 6 章。

压缩,是一种用时间换空间的 trade-off 思想,用 CPU 的时间去换磁盘或者网络 I/O 传输量,用较小的 CPU 开销来换取更具性价比的磁盘占用和更少的网络 I/O 传输。

Kafka 是一个高吞吐量、可扩展的分布式消息系统,深入掌握 Kafka 的数据压缩和批量数据处理机制,对于优化系统性能和资源使用至关重要。

Kafka 数据压缩机制

数据压缩在 Kafka 中有助于减少磁盘空间的使用和网络带宽的消耗,从而提升整体性能。

通过减少消息的大小,压缩可以显著降低生产者和消费者之间的数据传输时间。

Chaya:Kafka 支持的压缩算法有哪些?

在 Kafka 2.1.0 版本之前,Kafka 支持 3 种压缩算法:GZIP、Snappy 和 LZ4。从 2.1.0 开始,Kafka 正式支持 Zstandard 算法(简写为 zstd)。

Chaya:这么多压缩算法,我如何选择?

一个压缩算法的优劣,有两个重要的指标:压缩比,文件压缩前的大小与压缩后的大小之比,比如源文件占用 1000 M 内存,经过压缩后变成了 200 M,压缩比 = 1000 /200 = 5,压缩比越高越高;另一个指标是压缩/解压缩吞吐量,比如每秒能压缩或者解压缩多少 M 数据,吞吐量越高越好。

如下图是 Facebook Zstandard 官网提供的一份压缩算法 benchmark 比较结果:

d54756e2c0f5f6f7faf76901bc9d221e.png

从图中可以看到,ZSTD 压缩比最高,但是吞吐量中规中矩。LZ4 在吞吐量方面属于王者。

  • GZIP:压缩比高,但压缩和解压缩速度相对较慢。适用于对传输带宽要求较高的场景。

  • Snappy:由 Google 开发,压缩和解压缩速度快,但压缩比相对较低。适用于对性能要求较高的场景。

  • LZ4:在压缩和解压缩速度以及压缩比之间取得良好平衡。适用于对性能和压缩比有综合需求的场景。

  • ZSTD:由 Facebook 开发,提供高压缩比和较快的压缩解压速度。适用于对高效压缩和快速处理都有需求的场景。

在 Kafka 的性能测试结果中,不同压缩算法的两个指标有以下排序特点。

  • 吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;

  • 压缩比方面:zstd > LZ4 > GZIP > Snappy。

何时压缩

Chaya:我觉得可以在生产者和 Broker 端进行压缩,对么?

在生产者端压缩是很自然的想法,大部分情况下 Broker 收到 Producer 端的消息后是原封不动的保存,并不会进行压缩

生产者压缩

Kafka 的数据压缩主要在生产者端进行。具体步骤如下:

  1. 生产者配置压缩方式:在 KafkaProducer 配置中设置 compression.type 参数,可以选择 gzipsnappylz4zstd

  2. 消息压缩:生产者将消息批量收集到一个 batch 中,然后对整个 batch 进行压缩。这种批量压缩方式可以获得更高的压缩率。

  3. 压缩消息存储:压缩后的 batch 以压缩格式存储在 Kafka 的主题(Topic)分区中。

  4. 消费者解压缩:消费者从 Kafka 主题中获取消息时,首先对接收到的 batch 进行解压缩,然后处理其中的每一条消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多文件编程:c/c++分文件写法(入门)

前言 一个 C 项目通常会采取 声明与定义分离 的方式进行编写,其基本遵循:头文件中写声明,源文件中写定义。 此外,为了区分头文件与源文件,会采用不同的文件后缀: .h: 头文件 .cpp: 源文件 (当然还有其他的…

写真图片视频打赏系统源码全开源无加密

这是一款开源的写真图片及视频打赏系统源码,顾名思义他可以做写真图片打赏站也可以做视频打赏站,支付对接了易支付,拥有独立代理后台,全部源码无加密,另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介…

Shell命令技巧

1. 计算1~100的和 1.1 生成表达式 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 echo {1…100} | tr " &qu…

VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

Vector、ArrayList 和 LinkedList 都是Java集合框架中的类,用于存储一系列的元素。它们各自有不同的实现和性能特点: 1. Vector: - Vector 是 java.util 包中的一个类,继承自 java.util.AbstractList 类,并实现了 List 接口。…

小白如何学习软件开发

众所周知,软件开发技术是IT技术的核心技术,也是从事IT职业的技术学习首选,因此不少人会去学习,下面我给大家分享关于软件开发学习方法有哪些,欢迎阅读! 1、明确学习目的 学习编程能锻炼思维,使我们的逻辑思…

Windows图形界面(GUI)-DLG-C/C++ - 对话框的创建实现

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​​​​链接点击跳转博客主页 目录 对话框的创建实现 使用资源编辑器设计对话框 资源文件的创建和管理 对话框过程函数 对话框消息处理 示例代码 对话框的创建实现 使用资源编辑器设计对话框 使用资源编辑器设…

一些资源(●ˇ∀ˇ●)

GPT Kimi.ai - 帮你看更大的世界 (moonshot.cn) 文心一言 (baidu.com) 搜索AI伙伴 (baidu.com) 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn) 秘塔AI搜索 (metaso.cn) GitHub打不开 下载Watt Toolkit

LeetCode 2. 两数相加 --- 链表、模拟

目录 1. 思路与算法2. 代码3. 复杂度分析 题目简述:给定两个非空的链表,表示两个非负整数,它们每位数字都是按照逆序方式存储的。要求将这两个数相加,并以相同形式返回一个表示和的链表。每个链表中的节点只能存储一位数字&#x…

openlayers WebGL裁剪图层,双图层拼接显示

本篇介绍一下使用openlayers WebGL裁剪图层,双图层拼接显示 1 需求 WebGL裁剪图层,双图层拼接显示 2 分析 图层prerender和postrender事件的使用 WebGL scissor方法的使用 scissor方法指定了一个裁剪区域,用来将绘图区域限制在其限定的盒…

【LeetCode】2187. 完成旅途的最少时间

1. 题意 2. 分析 二分法有一个关键特征:如果答案answer满足题意,那么对于任何整数i,如果有i>answer,那么i也会是一个存在的解,只不过不是最优解。 本题想要找出一个达到 totalTrips 趟需要的最少时间成本t&#x…

设计模式——多例模式(23种之外)

多例模式(Multiton Pattern)是一种特殊的设计模式,它属于创建型模式。与单例模式(Singleton Pattern)相比,多例模式允许一个类有多个实例,但是实例的数量是有限制的,并且这些实例在全…

【Linux】Ubuntu配置JDK环境、MySQL环境

一、 Ubuntu配置JDK环境 在Ubuntu系统中安装JDK 8可以通过以下步骤进行: 打开终端。更新包列表: sudo apt update安装OpenJDK 8: sudo apt install openjdk-8-jdk验证安装是否成功: java -version注:如果系统中安…

4.10、matlab生成脉冲序列:pulstran()函数

1、matlab生成脉冲序列简介 MATLAB生成脉冲序列通常涉及到使用MATLAB中的函数或编程来创建具有特定时间间隔和幅度的脉冲信号。脉冲序列通常用于数字信号处理、通信系统测试等应用中。 生成脉冲序列可以采用以下方法之一: 使用MATLAB中的函数,例如square()函数生成方波信号…

FreeRTOS 入门 知识

什么是FreeRTOS FreeRTOS 是一个轻量级的实时操作系统(RTOS),由 Richard Barry 在 2003 年开发,并且由亚马逊的 FreeRTOS 项目(一个由 Amazon Web Services (AWS) 支持的开源项目)进一步推动和发展。FreeR…

麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140387947 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

Java--接口的定义与实现

1.Java的接口是一种约束 2.定义一些方法,让不同的人实现 3.方法都是 public abstract 4.常量都是public static final 5.接口不能被实例化: 接口中没有构造方法 6.接口可以多继承: 使用implements即可实现 7.必须要重写接口中的方法…

什么是稀疏化

稀疏化一词来源于条件计算理念。在稠密模型中,所有参数都发挥作用,而稀疏化可以只运行整个系统的某些部分。 前文提到 Shazeer 对机器翻译中的 MoE 进行了探索。条件计算(网络中只有某些部分处于活动状态)使得在不增加计算量的情况…

差分进化算法与遗传算法之间的区别

差分进化算法(Differential Evolution, DE)和遗传算法(Genetic Algorithm, GA)都是基于进化思想的优化算法,用于全局优化问题。尽管它们有许多相似之处,但在具体实现和应用上有明显的区别。 共同点 种群进…

Android系统上常见的性能优化工具

Android系统上常见的性能优化工具 以下是一些常见的性能优化工具,可用于辅助分析 Systrace 报告: Android Studio Profiler:它集成在 Android Studio 中,提供了 CPU、内存、网络等多方面的性能分析功能,能与 Systrace…

在家上网IP地址是固定的吗?

在数字化时代,互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都离不开网络的支持。然而,当我们在家中接入互联网时,可能会产生这样一个疑问:在家上网IP地址是固定的吗?下面一…