版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/suifeng3051/article/details/37606001

     本节主要从总体角度介绍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,则表示消息未被压缩。

四、消息转运过程中的可靠性
     在消息系统中,保证消息在生产和消费过程中的可靠性是十分重要的。在实际消息传递过程中,可能会出现例如以下三中情况:
  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,參考以下这幅图:
     

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VpZmVuZzMwNTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VpZmVuZzMwNTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

     想更深入的了解Kafka请參阅我的还有一篇文章:《Kafka设计与原理详细解释》
   
   转发请说明出处,原文链接:http://blog.csdn.net/suifeng3051/article/details/37606001  
   

kafka具体解释四:Kafka的设计思想、理念的更多相关文章

  1. kafka 名词解释(四)

    为什么要了解这些名词的解释呢?因为在学一个新的知识或者领域的时候,我们需要知道它所定义的概念和名词意思,因为只有这样我们才能理解和掌握这个新的知识点,才能更加系统的掌握这个技术. 一.名词解释 1.b ...

  2. Kafka详解四:Kafka的设计思想、理念

    问题导读 1.Kafka的设计基本思想是什么?2.Kafka消息转运过程中是如何确保消息的可靠性的? 本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做 ...

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

    转载自: http://my.oschina.net/geecoodeer/blog/194829 本文没有特意区分它们之间的区别,仅仅是列出其中笔者认为好的设计思想,供后续设计参考. 目前笔者并没有 ...

  4. kafka之二:Kafka 设计与原理详解

    一.Kafka简介 本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接 1.1 背景历史 当今社会各种应用系统诸如商业.社交.搜索. ...

  5. Kafka实战分析(一)- 设计、部署规划及其调优

    1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1 吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的 ...

  6. Kafka学习笔记之Kafka Consumer设计解析

    0x00 摘要 本文主要介绍了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level Consumer实现的语义,以 ...

  7. Kafka具体解释二、怎样配置Kafka集群

    Kafka集群配置比較简单,为了更好的让大家理解.在这里要分别介绍以下三种配置 单节点:一个broker的集群 单节点:多个broker的集群 多节点:多broker集群 一.单节点单broker实例 ...

  8. 中间件 | kafka简介、使用场景、设计原理、主要配置及集群搭建

    开源Java学习 公众号 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性 ...

  9. kafka学习(四)kafka安装与命令行调用

    文章更新时间:2020/06/07 一.安装JDK 过程就不过多介绍了... 二.安装Zookeeper 安装过程可以参考此处~ 三.安装并配置kafka Kafka下载地址  http://kafk ...

随机推荐

  1. [洛谷P2567] SCOI2010 幸运数字

    问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...

  2. Win10 设置系统时间

  3. CSS元素居中汇总

    总结实现不同类型元素居中的几种方法: 一.把margin值设置为auto(实现水平居中) 可以实现元素水平居中对齐 原理:使  margin-left=margin-right  如果设置  marg ...

  4. Qt android 配置

    http://www.cnblogs.com/ztzheng/p/3703716.html

  5. UE4联网游戏中让不同的客户端生成不同的Pawn类型

    效果描述 一个服务器,两个客户端,让他们连接后分别生成不同的Pawn,并且在不同的位置生成. 意义 这是个项目需求,但是我发现如果能够彻底理解并制作出这个功能,会对虚幻4内置的网络功能以及一些重要的G ...

  6. React-Native 之 GD (二)自定义共用导航栏样式

    1.自定义导航栏样式 步骤一:从效果图中可以看出,导航栏的样式都差不多,因为我们前面已经设置了 Navigator ,这边的话我们还需要自定义 Navigator 的样式,可以看到所有的 Naviga ...

  7. HTML,CSS,JS个别知识点总结

    <input>是自闭合标签,没有<input></input>一说,只能写作<input/>. <div>可以是行标签也可以作为块标签,作为 ...

  8. pepflashplayer32_25_0_0_127.dll: 0x59952C6D is not a valid instance ID.

    pepflashplayer32_25_0_0_127.dll: 0x59952C6D is not a valid instance ID. . 点进去是提示doctype错误 暂时没有解决---- ...

  9. 如何吸引用户打开自己发送的EDM邮件

    一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第8节 Math类_19_Math练习:小学数学真题

    题目 画数轴 解题思路 强转成int类型就会舍弃小数位数 输出最终的数量 如果用Math.ceil的方式的话