批处理可以产生较大顺序磁盘操作和连续内存块 , 不过也产生了较大的网络数据包 , 相应地 , Kafaka 会将消息压缩后发送 , 当消息写入日志时仍然是压缩形式 , 仅由使用者解压缩 。
数据零拷贝另一个问题是过多的字节复制 。//zzs001
一般情况下 , 数据从文件传输到 socket 的数据路径为:磁盘 -》内核的 pagecache -》用户空间缓冲区 -》内核的 socket 缓冲区 -》NIC 缓冲区 。

文章插图
显然 , 这是非常低效的 , 有四个副本和两个系统调用 。Kafka 使用 sendfile , 允许操作系统将数据从 pagecache 直接发送到网络 , 即磁盘 -》内核的 pagecache-》NIC 缓冲区 。从而避免这种重复复制和系统调用 。更多关于 sendfile 的内容可以参考Efficient data transfer through zero copy 。

文章插图
需要注意的是 , 由于 TLS/SSL 库是工作在用户空间的 , 所以 , 当启用了 SSL , sendfile 将不能使用 。
基于分区的横向扩展关于这一点 , 在上一篇博客中其实已经提到过 。首先 , 一个 topic 会划分成一个或多个 partition , 这些 partition 一般分布在不同的 broker 实例 。producer 发布的 event 会根据某种策略分配到不同的 partition , 这样做的好处是 , consumer 可以同时从多台 broker 读取 event , 从而大大提高吞吐量 。另外 , 为了高可用 , 同一个 partition 还会有多个副本 , 它们分布在不同的 broker 实例 , 和很多传统的消息系统不同 , Kafka 的副本是可读的 , 即 consumer 不仅可以从主 partition 读取 event , 也可以从副本读取 。//zzs001

文章插图
结语以上内容是最近学习 Kafka 的一些思考和总结(主要参考官方文档) , 如有错误 , 欢迎指正 。
任何的事物 , 都可以被更简单、更连贯、更系统地了解 。希望我的文章能够帮到你 。
最后 , 感谢阅读 。
参考资料Apache Kafka 官方文档
Benchmarking Kafka vs. Pulsar vs. RabbitMQ: Which is Fastest?
The OpenMessaging Benchmark Framework
The Pathologies of Big Data - ACM Queue
Efficient data transfer through zero copy - IBM Developer
相关源码请移步:https://github.com/ZhangZiSheng001/kafka-demo
本文为原创文章 , 转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/16788561.html【二 kafka详解--kafka为什么快】
经验总结扩展阅读
- 泡好的裙带菜可以留到第二天吃吗
- 世界公认二十款经典鸡尾酒
- subprocess Python编程之子进程管理详解
- 头伏吃什么二伏吃什么三伏吃什么
- 二 路径分析—PostgreSQL+GeoServer+Openlayers
- CentOS 7.9 安装 kafka_2.13
- 90年属马33岁有一劫
- 十二星座和哪些星座在一起是善缘
- 十二星座和哪个星座在一起是孽缘
- 十二星座在爱情里对哪个星座最狠心