热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kafka总结

一、kafka概述:1、消息队列:1)、原理及其有点:客户端消费Queue种的数据有两种方式:1、发布订阅模式,也就是一对多,数据生产之后,推给所有的订阅者,打个比方:就像是手机上

一、kafka概述:

1、消息队列:

1)、原理及其有点:

《Kafka 总结》
《Kafka 总结》

客户端消费Queue种的数据有两种方式:1、发布/订阅模式,也就是一对多,数据生产之后,推给所有的订阅者,打个比方:就像是手机上面的QQ消息,你没有打开手机看消息,但是如果有消息就会一直有消息推送过来。2、点对点模式,也就是一对一,这个是主动模式,第一种模式更像是被动模式,这个就是消费者主动拉取生产后的数据。

2、消息队列的优点:

1)、解耦。2)、冗余。3)、扩展性。4)、灵活性and峰值处理能力。5)、可恢复性。6)、顺序保证。(ps:kafka保证一个partition内的数据是有序的)7)、缓冲。8)、异步通信。

3、kafka基本术语:

1)、无论是kafka集群还是consumer,都依赖zookeeper集群来保存一些meta信息。

2)、Producer:消息生产者,向kafka broker发消息的客户端。

3)、consumer:消息消费者,向kafka broker取消息的客户端。

4)、Topic:可以理解是一个队列,一个topic里有很多个partition。

5)、consumer group:这是kafka用来实现topic广播的和单播的手段。topic的消息会复制(不是真正的复制)到所有的CG,但是每个partition只会把消息发给该CG中的一个consumer。广播的实现方法是:只要每个consumer有一个独立的CG就行了。单播的实现方法是:只要所有的consumer在同一个CG。

6)、Broker:一台kafka服务器就是一个broker,一个集群由多个broker。一个broker可以容纳多个topic。

7)、partition:一个非常大恶的topic可以分布在多个broker上,一个topic可以分成多个partition,每个partition是一个有序队列。partition中的每条消息都会被分配一个有序的ID,kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition)的顺序。

二、kafka工作流程:

1、Kafka生产过程:

1)、producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。

2)、分区:消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition Logs(分区日志)组成。

《Kafka 总结》
《Kafka 总结》
《Kafka 总结》
《Kafka 总结》

我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。

①分区的原因:1、方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;2、可以提高并发,因为可以以Partition为单位读写了。

②分区的原则:1、指定了patition,则直接使用;2、未指定patition但指定key,通过对key的value进行hash出一个patition;3、patition和key都未指定,使用轮询选出一个patition。

3)、副本:

同一个partition可能会有多个replication,没有replication的情况下,一旦broker 宕机,其上所有 patition 的数据都不可被消费,同时producer也不能再将数据存于其上的patition,没有replication的情况下,一旦broker 宕机,其上所有 patition 的数据都不可被消费,同时producer也不能再将数据存于其上的patition。

4)、写入流程:

《Kafka 总结》
《Kafka 总结》

2、Broker保存消息:

1)、存储方式:

物理上把topic分成一个或多个patition,每个patition物理上对应一个文件夹(该文件夹存储该patition的所有消息和索引文件)。

2)、存储策略:

无论消息是否被消费,kafka都会保留所有消息。有两种策略可以删除旧数据:
1)基于时间:log.retention.hours=168
2)基于大小:log.retention.bytes=1073741824
需要注意的是,因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关。

3)、zookeeper的存储结构:

《Kafka 总结》
《Kafka 总结》

4)、kafka消费过程分析:

(1)、高级API优点:
1、高级API 写起来简单
2、不需要自行去管理offset,系统通过zookeeper自行管理。
3、不需要管理分区,副本等情况,.系统自动管理。
4、消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据(默认设置1分钟更新一下zookeeper中存的offset)。

5、可以使用group来区分对同一个topic 的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响)

(2)、高级API缺点:
1、不能细化控制如分区、副本、zk等。
2、不能自行控制offset(对于某些特殊需求来说)。

(3)、低级API优点:
1、能够让开发者自己控制offset,想从哪里读取就从哪里读取。
2、自行控制连接分区,对分区自定义进行负载均衡
3、对zookeeper的依赖性降低(如:offset不一定非要靠zk存储,自行存储offset即可,比如存在文件或者内存中)
(4)低级API缺点
1、太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。

(5)、消费者组:

在这种情况下,消费者可以通过水平扩展的方式同时读取大量的消息。另外,如果一个消费者失败了,那么其他的group成员会自动负载均衡读取之前失败的消费者读取的分区。消费者是以consumer group消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。在图中,有一个由三个消费者组成的group,有一个消费者读取主题中的两个分区,另外两个分别读取一个分区。某个消费者读取某个分区,也可以叫做某个消费者是某个分区的拥有者。

(6)、消费方式:

1、consumer采用pull(拉)模式从broker中读取数据。
2、push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。
3、对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。
4、pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在我们的拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小)。

三、kafka消息保证机制:

1、At most once:消息可能会丢,但是绝对不会重复传递。

读完消息之后先commit然后再处理消息,在这种模式下comsumer在commit后还没有来得及处理就crash了,下次重新开始工作之后无法读到刚刚已提交而未处理的消息,这就对应了At most once。

2、At least once:消息绝对不会丢,但是可能重复传递。

读完消息之后先处理消息然后再commit,如果在消息处理之后commite之前crash,下次重新开始工作的时候刚刚处理未提交commit消息,但是实际上该消息已经被处理过,这就对应了At least once。

3、Exactly once:每条消息之传输一次仅被传输一次。

如果要做到Exactly once,那么就需要offset来帮助实现,通用的方式是将offset和操作输出输出到同一个地方,但是对于high API来说,offset是保存在zk中的,无法输出到同一个低方,lower API是自己维护offset的,可以将它存在同一个地方,一般存在HDFS。

4、如何保证数据不丢失:

(1)、broker如何保证数据的不丢失:

acks=all : 所有副本都写入成功并确认。
retries = 一个合理值。
min.insync.replicas=2 消息至少要被写入到这么多副本才算成功。
unclean.leader.election.enable=false 关闭unclean leader选举,即不允许非ISR中的副本被选举为leader,以避免数据丢失。

(2)、consumer如果保证数据得不丢失:

enable.auto.commit=false 关闭自动提交offset。

更多文章见:

让我遇见你。www.shiruiblog.cn《Kafka 总结》


推荐阅读
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 伸缩性|发生_分布式文件系统设计,该从哪些方面考虑?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了分布式文件系统设计,该从哪些方面考虑?相关的知识,希望对你有一定的参考价值。点击上方关注“ ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
  • 前言折腾了一段时间hadoop的部署管理,写下此系列博客记录一下。为了避免各位做部署这种重复性的劳动,我已经把部署的步骤写成脚本,各位只需要按着本文把脚本执行完,整个环境基本就部署 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文总结了淘淘商城项目的功能和架构,并介绍了传统架构中遇到的session共享问题及解决方法。淘淘商城是一个综合性的B2C平台,类似京东商城、天猫商城,会员可以在商城浏览商品、下订单,管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。商城的架构包括后台管理系统、前台系统、会员系统、订单系统、搜索系统和单点登录系统。在传统架构中,可以采用tomcat集群解决并发量高的问题,但由于session共享的限制,集群数量有限。本文探讨了如何解决session共享的问题。 ... [详细]
  • 开发笔记:读《分布式一致性原理》JAVA客户端API操作2
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了读《分布式一致性原理》JAVA客户端API操作2相关的知识,希望对你有一定的参考价值。创 ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • Zookeeper 总结与面试题汇总
    Zookeeper总结与面试题汇总,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
author-avatar
叶肖帆Seantq_693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有