热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

一周一个中间件kafka原理篇(为什么性能这么高)

前言ApacheKafka最早是由LinkedIn开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。尤其是做日志中间件。K

前言


Apache Kafka 最早是由 LinkedIn 开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。尤其是做日志中间件。



  • Kafka是一个分布式系统,具备高扩展高吞吐高性能的特性.

  • Kafka的单机吞吐量可达十万级别,时效性是ms级别。对比ActiveMQ吞吐量猜到万级别。在集群维度下,随着topic数量增多,分区数量增多,可以自由往上扩展吞吐,可达百万级别。

  • kafka的消息可靠性,经过参数优化配置,可以做到 0 丢失。



背景


我们公司迁移ActiveMQ消息中间件,为了减少资源开支,引入Kafka这种高性能高吞吐高并发的消息组件,相同的数据消息,kafka所需要的的资源开支更少,性能更高,减少公司的开支。



知识准备



  • broker


即代表的一个kafka的server服务器,一个topic主题下可以在多个broker存在,只不过是一个是主的,其他是从的。




  • Topic


Topic是kafka用于存储消息的逻辑概念,可以看出是一个消息集合。每个Topic可以有多个生产者向其中推送消息,也可以有任意多个消费者消费其中的消息。




  • Partition分区


每个Topic都有多个分区,每个Rartition分区所存储的消息都是不同的,类似数据的水平切分的思想,可以提高并发读写的能力。




  • 消费组consumer group / 消费者 consumer


每个消费者都会绑定一个消费者组,一个分区的某一个消息只能由消费组下的某一个消费者消费,但是这个分区下的所有消息会均匀的被消费组的消费者消费。

如果每个消费者都绑定不同的消费组,那么就实现了订阅的模式,分区下的每一个消息都会被广播到所有消费者。




  • Queue


ActiveMQ等消息中间件的消息概念,是队列的意思。在这个队列的消息只能被一个消费者消费一次。



kafka基础


总所周知,kafka的性能是高于业界其他的消息中间件,并且集开源,社区活跃的众多优点。但是我们有没有想到为什么kafka的性能会这么高,他与其他消息中间件有什么区别,使用了其他中间件那些没有的技术。

答案就是 1. 顺序读写方式 2. MMfile技术 3. 零拷贝技术


顺序读写


对比其他的消息中间件,例如ActiveMQ消息中间件,他对于写数据就是随机写入磁盘,然后读取时也是精准查找。但是因为大量的IO寻址操作耗费大量的时间,所以kafka在这点上进行优化处理,采用顺序读写,将生产者发送的数据存储到partition中的文件里,以此实现顺序写入,而消费者因为自带offset,可以接着上次的读写位置继续读取消息,从而实现顺序读。想对于其他消息中间件减少了大量的IO寻址时间,据网上查询顺序读写速度可达到400M/s,而随机读写慢的话可以达到几百K/s。


MMfile技术


MMfile就是Memory Mapped file内存映射文件,是现在操作系统的分页存储系统,简单来说就是讲磁盘上的文件映射到内存上pagecache中,kafka向文件中写数据时,会直接向内存中PageCache中去写,然后操作系统自动刷新到硬盘上,极大降低IO的使用效率,但是这个技术有个问题一旦断电就会丢失消息。(这个丢失数据只是针对单个kafka的数据,但是因为kafka集群有一定的消息存储策略,消息可以做到不会丢失)


零拷贝技术


假如消费者向kafka的分区leader去拉去消息,传统的数据传输就是




  1. 第一步将数据从磁盘中找到,拷贝到内核态的缓存中。

  2. 第二步将内核态的缓存再次拷贝到用户态的内存中。

  3. 第三部将用户态的内存数据拷贝到内核态的socket buffer中,再由网络传输到达消费者。


kafka采用零拷贝技术,所谓的零拷贝也不是真正意义上的不拷贝,只是减少拷贝的次数,提高传输效率。




  1. 第一步将数据从磁盘中找到,拷贝到内核态的缓存中。

  2. 第二步将用内核态的缓存数据拷贝到内核态的socket buffer中,再由网络传输到达消费者。

    这样就减少一次拷贝次数,提高传输效率。


以上都是单机下的性能优势。



kafka集群有什么优势之处,可以提高kafka的吞吐量呢?


上面有提到kafka有别于ActiveMQ消息中间件的消息逻辑概念。他只有topic主题概念。但是因为和ActiveMQ的架构概念不同,导致二者集群对外提供服务的上限不同。

ActiveMQ集群架构可以有简单的Master-Slave架构,这个就是很简单,Master机器对外提供服务,Slave机器作为灾备机器,一旦Master出现宕机,Slave继续对外提供服务,但是这样的话整个集群对外提供服务的能力就集中在Master机器上。

ActiveMQ集群架构可以Networks of Brokers架构,当某一个broker出现积压的消息时,会转移到另一一个broker服务,从来是整个系统对外提供服务提高一部分。



但是相对于kafka来说,他从内部架构逻辑上已经考虑到大数据量的问题,它有topic--broker--partition-consumer概念,来创造一个可扩展,高吞吐的一个对外提供服务的消息组件。

上面kafka只有topic这一种消息逻辑结构,一个topic下有多个分区partition,每个分区存储不同的数据,而这些分区有均匀分布在多个broker之间.

kafka生产者会发送消息给topic下的partiton leader,消费者也会向partition leader拉去消息。理论上我们只有增多我们broker服务,建立更多的partiton分区,我们就可以对外提供更高的吞吐服务。




推荐阅读
  • 启动activemq_「Java」SpringBoot amp; ActiveMQ
    一、消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构, ... [详细]
  • Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及流式消费变化数据的能力。应用场景近实时数据摄取Hudi支持插入、更新和删除数据的能力。您 ... [详细]
  • 如何实现canal数据同步
    Canal简介与安装Canal简介Canal是阿里巴巴开发的MySQLbinlog增量订阅&消费组件。Canal是基于MySQL二进制日志的高性能数据同步系统。Canal在阿 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • 通过一张截图深入解析字节跳动的 Java 开发实力
    在与一位来自字节跳动的朋友交流时了解到,根据他们近期招聘Java工程师的经验,大多数候选人往往在工作3年后会遇到一个难以跨越的瓶颈期。这是因为在职业生涯的这个阶段,许多工程师的技术深度和广度已经达到了一定的水平,但要进一步提升则需要更多的挑战和学习机会。字节跳动作为一家技术驱动的公司,通过严格的面试流程和实际项目经验,能够更好地评估候选人的技术水平和发展潜力。 ... [详细]
  • 本文将深入探讨MySQL存储引擎的特性及其选择策略。在MySQL 5.1之前的版本中,存储引擎必须与MySQL一同编译和安装。自5.1版本起,存储引擎通过插件化接口实现,显著提升了灵活性和扩展性。文中详细分析了不同存储引擎的特点,如InnoDB、MyISAM等,并提供了针对具体应用场景的优化建议,帮助读者更好地理解和选择适合的存储引擎,以提升数据库的整体性能。 ... [详细]
  • 本文总结了 Apache Shiro 安全框架的学习体会,并通过具体应用实例进行了详细分析。Apache Shiro 是一个强大且灵活的安全框架,适用于各种应用程序的安全需求。通过对该框架的核心功能和使用方法的深入探讨,本文不仅帮助读者理解其基本概念和架构设计,还提供了实际项目中的应用示例,以便更好地掌握和运用这一工具。特别感谢开涛的博客文章,为本文提供了宝贵的参考和启发。 ... [详细]
  • 比尔·盖茨最新个人网站出人意料地选择Linux服务器,背后有何深意?
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 9月10日,ShanghaiApacheSparkMeetup聚会在上海通茂大酒店成功举办。本次活动邀请到运营商和高校讲师来分享经验,主题覆盖了从Spark研发到应用的各种不同视角 ... [详细]
  • 首次探索Serf:分布式服务协调工具的入门指南
    serf是出自Hashicorp的开源项目,实现了去中心化的gossip(八卦)协议,其中gossip协议定义了一种类似病毒感染的消息传播过程。一些著名的开源项目,如Docker和 ... [详细]
  • 2019.12.19
    LAMP环境搭建与配置 1.安装MySQL  下载软件包  #uname-i(x86_64)查看Linux多少位 (1)初始化 #tarzvfmysql*** [-dusrloca ... [详细]
  • 工程项目管理系统源码简洁+好用+全面工程项目管理系统
    ​​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织 ... [详细]
  • 字节Java高级岗:java开发cpu吃多线程吗
    前言抱着侥幸心理投了字节跳动后台JAVA开发岗,居然收到通知去面试,一面下整个人来都是懵逼的,不知道我对着面试官都说了些啥(捂脸~~)。侥幸一面居然过了,三天后接到二面通知,结果这 ... [详细]
  • 洞见RSAC|点击获取企业安全策略“工具包”
    为用户提供安全智 ... [详细]
  • 「驭龙」开源主机入侵检测系统了解一下
    「驭龙」开源主机入侵检测系统了解一下 ... [详细]
author-avatar
遗忘的花心本分尐男人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有