专栏首页转行程序员同样是消息中间件,Kafka吞吐量为何如此优秀。

同样是消息中间件,Kafka吞吐量为何如此优秀。

201995星期四

49篇原创

Apache Kafka基准测试:每秒写入2百万(在三台廉价机器上),网上也有很多Kafka的测试文章,测试结果通常都是“吊打”其他MQ。是不是吹牛逼你是否怀疑过or考察过。

带着这个问题,小编在公司公开课有幸听了Kafka开发者之一来公司演讲,解释了Kafka的设计原理,深入理解Kafka为何能“吊打”其他MQ。

先理解几个关于Kafka的名词:

  • Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
  • Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。
  • Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。
  • Segment:partition物理上由多个segment组成,下面2.2和2.3有详细说明。
  • offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息.

原理分析

  1. 消息顺序写入:一个topic在多个Partition中顺序写入,利用了磁盘连续读写性能远远高于随机读写的特点,它充分利用了现代操作系统分页存储来利用内存提高I/O效率。通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。
  2. 内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
  3. 消息从java堆转入page cache(即物理内存)。由异步线程刷盘,消息从page cache刷入磁盘。
  4. 批量压缩:它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO损耗,通过mmap提高I/O速度,写入数据的时候由于单个Partion是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出。
  5. 消息直接从page cache转入socket发送出去。当从page cache没有找到相应数据时,此时会产生磁盘IO,从磁 盘Load消息到page cache,然后直接从socket发出去

partiton中文件存储方式

  • 每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。
  • 每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。

本文分享自微信公众号 - 转行程序员(be_coder),作者:转行程序员

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis大key多key拆分方案

    (如无意外,文章中所提及的hash,set等数据结构均指redis中的数据结构 )

    王炸
  • Java和Python哪个更适合初学者的问题

    我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。

    王炸
  • Elasticsearch源码解析高并发写入优化

    导语:在腾讯金融科技数据应用部的全民 BI 项目里,我们每天面对超过 10 亿级的数据写入,提高 ES 写入性能迫在眉睫,在最近的一次优化中,有幸参与到了 El...

    王炸
  • [linux][memory]balloon性能优化的几种方案分析

    前言: Memory Balloon作为虚拟化平台上的一个重要内存QoS方案,作者在前文《[linux][memory]balloon技术分析 》中做过原理性的...

    皮振伟
  • VB.NET 根据年月日判断星期几!

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.E...

    巴西_prince
  • mysql 大数据量迁移

    MySQL导出的SQL语句在导入时如果数据量较大时会非常非常慢,经历过导入仅3000万条,用了近30个小时。在导出时合理使用几个参数,可以大大加快导入的速度。

    兜兜毛毛
  • VB.NET 根据年份判断生肖!

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.E...

    巴西_prince
  • 简单的注册模块表单验证处理

    表单具有 onsubmit = "return check()"行为,处理验证情况

    书童小二
  • ffmpeg 安装,转视频格式为m3u8,压缩视频

    本文介绍 ffmpeg 的安装,转视频格式为m3u8,压缩视频 ## ffmpeg 安装 直接安装: apt-get install ffmpeg 运行  f...

    smy
  • linux Centos系统中添加一个新用户并授权的步骤

    声明: 如果您有更好的技术与作者分享,或者商业合作; 请访问作者个人网站 http://www.esqabc.com/view/message.html ...

    Mr.Vv

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动