kafka入门二:Kafka的设计思想、理念

本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做深入介绍,在这里只做较概括的描述以便大家更好的理解Kafka的独特之处。本节主要涉及到如下主要内容:

  • Kafka设计基本思想
  • Kafka中的数据压缩
  • Kafka消息转运过程中的可靠性
  • Kafka集群镜像复制
  • Kafka 备份机制

一、kafka由来

由于对JMS日常管理的过度开支和传统JMS可扩展性方面的局限,LinkedIn(www.linkedin.com)开发了Kafka以满足他们对实时数据流的监控以及对CPU、IO利用率等指标的高要求。在Linkedin开发Kafka之初,把关注重点集中在了这几个方面:

  • 为生产者和消费者提供一个通用的API
  • 消息的持久化
  • 高吞吐量,可以满足百万级别消息处理
  • 对分布式和高扩展性的支持

二、基本思想

一个最基本的架构是生产者发布一个消息到Kafka的一个主题(topic),这个主题即是由扮演KafkaServer角色的broker提供,消费者订阅这个主题,然后从中获取消息,下面这个图可以更直观的描述这个场景:

上图所示的架构分为三部分:Producers、Kafka broker、consumers,它们分别运行在不同的节点。

下面概括介绍一下Kafka一些设计思想:

  consumer group:各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组。

 消息状态:在Kafka中,消息的状态被保存在consumer中,broker不会关心哪个消息被消费了被谁消费了,只记录一个offset值(指向partition中下一个要被消费的消息位置),这就意味着如果consumer处理不好的话,broker上的一个消息可能会被消费多次。

 消息持久化:Kafka中会把消息持久化到本地文件系统中,并且保持极高的效率。

  消息有效期:Kafka会长久保留其中的消息,以便consumer可以多次消费,当然其中很多细节是可配置的。

批量发送:Kafka支持以消息集合为单位进行批量发送,以提高push效率。

 push-and-pull:Kafka中的Producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生产和消费是异步的。

Kafka集群中broker之间的关系:不是主从关系,各个broker在集群中地位一样,我们可以随意的增加或删除任何一个broker节点。

负载均衡方面:Kafka提供了一个 metadata API来管理broker之间的负载(对Kafka0.8.x而言,对于0.7.x主要靠zookeeper来实现负载均衡)。

 同步异步:Producer采用异步push方式,极大提高Kafka系统的吞吐率(可以通过参数控制是采用同步还是异步方式)。

分区机制partition:Kafka的broker端支持消息分区,Producer可以决定把消息发到哪个分区,在一个分区中消息的顺序就是Producer发送消息的顺序,一个主题中可以有多个分区,具体分区的数量是可配置的。分区的意义很重大,后面的内容会逐渐体现。

离线数据装载:Kafka由于对可拓展的数据持久化的支持,它也非常适合向Hadoop或者数据仓库中进行数据装载。

 插件支持:现在不少活跃的社区已经开发出不少插件来拓展Kafka的功能,如用来配合Storm、Hadoop、flume相关的插件。

三、消息压缩

我们上面已经知道了Kafka支持以集合为单位发送消息,在此基础上,Kafka还支持对消息集合进行压缩,Producer端可以通过GZIP或Snappy格式对消息集合进行压缩。Producer端进行压缩之后,在Consumer端需进行解压。压缩的好处就是减少传输的数据量,减轻对网络传输的压力,在对大数据处理上,瓶颈往往体现在网络上而不是CPU(压缩和解压会耗掉部分CPU资源)。

那么如何区分消息是压缩的还是未压缩的呢,Kafka在消息头部添加了一个描述压缩属性字节,这个字节的后两位表示消息的压缩采用的编码,如果后两位为0,则表示消息未被压缩。

具体细节请参考:  https://cwiki.apache.org/confluence/display/KAFKA/Compression

四、消息转运过程中的可靠性

在消息系统中,保证消息在生产和消费过程中的可靠性是十分重要的,在实际消息传递过程中,可能会出现如下三中情况:

  1. 一个消息发送失败
  2. 一个消息被发送多次
  3. 最理想的情况:exactly-once ,一个消息发送成功且仅发送了一次

    有许多系统声称它们实现了exactly-once,但是它们其实忽略了生产者或消费者在生产和消费过程中有可能失败的情况。比如虽然一个Producer成功发送一个消息,但是消息在发送途中丢失,或者成功发送到broker,也被consumer成功取走,但是这个consumer在处理取过来的消息时失败了。

从Producer端看:Kafka是这么处理的,当一个消息被发送后,Producer会等待broker成功接收到消息的反馈(可通过参数控制等待时间),如果消息在途中丢失或是其中一个broker挂掉,Producer会重新发送(我们知道Kafka有备份机制,可以通过参数控制是否等待所有备份节点都收到消息)。

从Consumer端看:前面讲到过partition,broker端记录了partition中的一个offset值,这个值指向Consumer下一个即将消费message。当Consumer收到了消息,但却在处理过程中挂掉,此时Consumer可以通过这个offset值重新找到上一个消息再进行处理。Consumer还有权限控制这个offset值,对持久化到broker端的消息做任意处理。

五、mirror一个Kafka集群

关于Kafka集群的mirror,参考下面这幅图:

具体细节请参考:https://cwiki.apache.org/confluence/display/KAFKA/Kafka+mirroring

六、备份机制

备份机制是Kafka0.8版本的新特性,备份机制的出现大大提高了Kafka集群的可靠性、稳定性。有了备份机制后,Kafka允许集群中的节点挂掉后而不影响整个集群工作。一个备份数量为n的集群允许n-1个节点失败。在所有备份节点中,有一个节点作为lead节点,这个节点保存了其它备份节点列表,并维持各个备份间的状体同步。下面这幅图解释了Kafka的备份机制:

具体细节请参考:https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Replication

kafka入门二:Kafka的设计思想、理念,布布扣,bubuko.com

时间: 2024-09-29 20:45:23

kafka入门二:Kafka的设计思想、理念的相关文章

Java(二)--OOP设计思想

(一)java中的oop思想的由来 机器语言-直接有计算机的指令组成,指令.数据.地址都已"0"和"1"组成:可以被计算机直接执行. 汇编语言-用容易理解和记忆的符号表示指令.数据以及寄存器等,抽象层次低,程序员需要考虑大量的机器细节. 高级语言-接军人类的自然语言,提出了结构化数据和语句,为面向数据和过程抽象的. 面向对象-抽象成了现实的事物. (二)OOP的设计思想 从上图中我们可以看到:OOP的设计思想是:有哪些类?这些类有哪些方法?这些类有哪些属性?类和类之

spring入门篇2 --- IOC设计思想

在上一篇中已经大致了解了IOC的设计思想,IOC全拼是Inversion of Control,就是控制反转,以前我们都是自己创建对象,进行实例化,现在交给框架spring来进行控制,以实现高度的解耦. IOC是设计思想,是Spring的核心,我们必须要掌握,因此通过几个例子,来看看到底是如何实现的,这样就可以有更清晰的认知,所有的demo源码放在了github上,后续学习过程会进行持续的更新,以后不再赘述. 学习这个之前,我们需要了解一下什么是DI,Dependency Injection,依

全网最通俗易懂的Kafka入门!

摘自:https://www.cnblogs.com/Java3y/p/11982381.html 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在这篇之前已经写过两篇基础文章了,强烈建议先去阅读: 什么是ZooKeeper? 什么是消息队列? 众所周知,消息队列的产品有好几种,这里我选择学习Kafka的原因,无他,公司在用. 我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ

【转帖】全网最通俗易懂的Kafka入门

全网最通俗易懂的Kafka入门 http://www.itpub.net/2019/12/04/4597/ 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 众所周知,消息队列的产品有好几种,这里我选择学习Kafka的原因,无他,公司在用. 我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ)改版,于是我就想学学Kafka这款消息队列啦.本篇文章对Kafka入门,希望对大家有所帮助

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

Kafka/Metaq设计思想学习笔记 转

转载自: http://my.oschina.net/geecoodeer/blog/194829 本文没有特意区分它们之间的区别,仅仅是列出其中笔者认为好的设计思想,供后续设计参考. 目前笔者并没有深入代码研究其细节,如有不正确的地方,请斧正. 概念和术语 消息,全称为Message,是指在生产者.服务端和消费者之间传输数据. 消息代理:全称为Message Broker,通俗来讲就是指该MQ的服务端或者说服务器. 消息生产者:全称为Message Producer,负责产生消息并发送消息到m

_00017 Kafka的体系结构介绍以及Kafka入门案例(初级案例+Java API的使用)

博文作者:妳那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Kfaka的体系结构 # 学习前言 Kafka的整个学习过程就是自己看官网的文档,出

[Hadoop大数据]--kafka入门

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

kafka入门详细讲解

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决. 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案.Kafka的目的是通过Hadoop的并行加载机制来统一线上和离