zookeeper学习之Kafka基础理念(五)

8 篇文章 0 订阅
4 篇文章 0 订阅

官网:http://kafka.apache.org/

Kafka是一种高吞吐量的 分布式 发布订阅消息系统,使用scala编写。

  • 源自LinkedIn
  • kafka是用于构建实时数据管道和流应用程序
  • 消息发布&订阅
  • 高效并实时处理
  • 数据安全的在分布式中进行副本存储
  • 具有横向扩展,容错,快速等优点,并已在成千上万家公司运行
  • 是消息中间件的一种

相关术语:

  • Topic:kafka按照topic分类来维护消息【可以让消息独立指定消费者消费,前提是订阅了该主题(当然也可以订阅多个消息,消费多个主题)】
  • producer:我们将发布(publish)消息到topic的进程称之为生产者(producer)。
  • consumer:我们将订阅(subscribe)topic并且处理topic中消息的进程称之为消费者(consumer)
  • broker:kafka以集群的方式运行,集群中的每一台服务器称之为代理(broker)

服务端(brokers)和客户端(producer、consumer)之间通信通过TCP协议来完成。我们为kafka提供了一个java客户端,但是也可以使用其他语言编写的客户端

Topic和log

让我们首先深入理解kafka提出一个高层次的抽象概念-Topic

可以理解topic是一个类别的名称,所有的message发送到topic下面。

partition是一个有序的message序列,这些message按顺序添加到一个叫做 commit log的文件中。每个parttion中的消息都有一个唯一的编号,称之为offset,用来唯一标识某个分区的message

提示:每个partition,都对应一个commit-log。一个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。

kafka集群,在配置的时间范围内,维护所有的producer生成的消息,而不管这些消息有没有被消费。例如日志保留(log retention)时间被设置为2天。kafka会维护最近两天生产 的所有消息,而2天前的消息会被丢弃,kafka的性能与保留的数据量的大小没有关系,因此保存大量的数据(日志信息)不会有什么影响。每个consumer是基于自己在commit log中的消费进度(offset)来进行工作的,在kafka中,offset由consumer来维护:一般情况下我们按照顺序逐条消费commit log中的消息,当然我可以通过指定offset来重复消费某些消息,或者跳过某些消息。

这意味着kafka中的consumer对集群的影响是非常小的,添加一个或者减少一个consumer,对于集群或者其他consumer来说,都是没有影响的,因此每个consumer维护各自的offset。

对log进行分区(partition)有以下目的:

  • 首先当log文件大小超过系统文件 系统的限制时,可以自动拆分。
  • 每个partition对应的log都会受到所在机器的 文件系统 大小的限制,但是一个topic中是可以有很多分区的
  • 因此可以处理任意数量的数据。
  • 另一方面,是为了提高并行度

kafka特点:

  • 他有一个offset(偏移量),这个就可以根据偏移量指定消息消费。
  • 而且他的partition中的消息,被消费之后不会立即被丢弃,而是可以设置 log retention 日志保留天数,你设置多少天他就多少天丢弃。
  • 他的消息是无状态的,也就是说 一个consumer消费到第8个消息时挂掉了,这时候再来一个consumer 你如果不指定偏移量的话,他会从最开始的地方开始,也就是从头消费,无状态耦合度会降低  性能也会提高

Distribution

log的partition分布在kafka集群中不同的broker上,每个broker可以请求备份其他broker上partition上的数据。kafka集群支持配置 一个partition备份 的 数量。

针对每个partition,都有一个broker起到“leader”的作用,0个多个其他的broker作为“followers”的作用。leader处理所有的针对partition的读写请求,而follower被动复制leader的结果。如果这个leader失效了,其中的一个follower将会自动的变成新的leader。每个broker都是自己所管理的partition的leader,同时又是其他broker所管理partitions的followers,kafka通过这种方式来达到负载均衡。

Producers

 生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过rounf-robin做简单的负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多。

Consumers

传统的消息传递模式有两种:队列(queuing)和(publish-subscribe:发布订阅)。

在queuing模式中,多个consumer从服务器中读取数据,消息只会到达一个consumer。在publish-subscribe模型中,消息会被广播给所有的consumer。kafka基于这2两种模式提供了一种consumer的抽象概念:consumer group。

每个consumer都要标记自己属于哪一个consumer group。发布到topic中的message中 message会被传递到consumer group中的consumer实例。consumer实例可以运行在不同的进程上,也可以在不同的物理机器上。

如果所有的consumer都有着自己唯一的consumer group,这就类似于传统的publish-subscribe并在众多的consumer instance之间进行负载均衡。

如果所有的consumer都有着自己唯一的consumer group,这就类似于传统的publish-subscribe模型。更一般的情况是,通常一个topic会有几个consumer group,每一个consumer group都是一个逻辑上的订阅者(logical subscriber)。每个consumer group由多个consumer instance组成,从而达到可扩展和容灾的功能。这并没有什么特殊的地方,仅仅是将publish-subscribe模型中的运行 在单个线程上的 consumers中的 consumer 替换成一个consumer group

 

说明:由两个broker组成的kafka集群,总共有4个partition(p0-p3)。这个集群有两个consumer group,a有两个consumer instances ,b有4个

消费顺序

kafka比传统的消息系统有着更强的顺序保证,在传统的情况下,服务器按照顺序保留消息到队列,如果有多个consumer来消费队列中的消息,服务器会接受消息的顺序向外提供消息,但是尽管服务器是按照顺序提供消息,但是消息传递到每一个consumer是异步 的,这可能导致先消费的consumer获取到消息时间 可能 比后消费的consumer获取到消息的时间长,导致不能保证顺序性。这表明,当进行并行消费的时候,消息在多个consumer之间可能食去顺序性。消息系统通常会采取一种 “ exclusive consumer ” 的概念,来确保同一时间内只有一个consumer能够从队列中进行消费,但是这实际上意味着在消息处理的过程中是不支持并行的。

kafka在这方面做的更好。通过topic中并行度的概念,即partition,kafka可以同时提供顺序性保证和多个consumer同时消费时的负载均衡,实现的原理是通过将一个topic中的partition分配给一个consumer group中的不同consumer instance。通过这种方式,我们可以保证一个partition在同一个时刻只有一个consumer instance在消费,从而保证顺序。虽然一个topic中有多个partition,但是一个consumer group中同时也有多个consumer instance,通过合理的分配依然能够保证负载均衡。需要注意的是,一个consumer group中的consumer instance的数量不能比一个topic中的partition的数量多

kafka只在partition的范围内保证消息消费的局部顺序性,不能在同一个topic中的多个partition中保证总的消费顺序性。通常来说,这已经可以满足大部分应用的需求。但是,如果的确又在总体上保证消费的顺序的需求的话,那么我们可以通过将topic的partition数量设置为1,将consumer group中的consumer instance也设置为1。

Guarantees(保证)

从较高的层面来说的话,kafka提供了以下的保证:

  • 发送到一个topic中的message会按照发送的顺序添加到commit log中

 

 

 

 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值