博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一篇认识kafka
阅读量:3905 次
发布时间:2019-05-23

本文共 3961 字,大约阅读时间需要 13 分钟。

一篇认识kafka

1. Kafka是什么?

  1. Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。
  2. Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。
  3. 无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。

官网:

在这里插入图片描述

2.Kafka能帮我解决什么?

  1. 解耦合、扩展性
  2. 异步通信、并行处理
  3. 缓冲、峰值处理能力
  4. 顺序保证

3.kafka与activeMQ的区别

activeMQ主要是基于一种pub和sub的架构,服务端主动推送消息给订阅者(发布订阅模型)。 JMS
kafka是基于push和poll的过程,生产者主动把消息发送到kafka集群当中,消费者主动从kafka集群中pull消息(主动拉取的行为)

4.kafka与RabbitMQ的区别

4.1、在架构模型方面
  • RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制

  • kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。

4.2、在吞吐量
  • kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
  • rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。
4.3、在可用性方面
  • rabbitMQ支持miror的queue,主queue失效,miror queue接管。
  • kafka的broker支持主备模式。
4.4、在集群负载均衡方面
  • kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分

5、 kafka的架构模型

5.1 架构图一

在这里插入图片描述

5.2 架构图二 (基于图一的延伸)

在这里插入图片描述

如何确保消息的可靠?

producer(生产者): ack确认机制

consumer(消费者): 集群中broker记录了每个partition中数据消费的offset,这个值指向了下一个consumer需要消费的message,如果中途consumer挂掉,下次再启动consumer连上kafka的时候,broker还记录了上次这个consumer消费的数据offset,接着下一条message继续消费即可。

kafka数据生产成功的确认ACK机制:

broker接收到producer生产的数据之后,有一个确认反馈机制,表示数据是否已经保存好

1:接收到partition中leader确认数据保存好
0:不接收partition中leader的任何反馈数据
-1:接收到partition中leader以及所有副本确认数据保存好的通知

kafka集群的负载均衡

一个partition只能被一个消费者消费,一个消费者可以消费多

partition,所以如果设置的partition数量小于consumer的数量,就会导致空闲的consumer没有消费,所以partition的数量一定要大于或等于consumer的数量
另一方面:partition的数量一定要大于broker的数量,这样leaderpartition就会均匀的分布在各个broker中,实现负裁的均衡

模型中的名次解释:
  • producer:生产者,主要用于我们的消息的生产,通过producer将我们的消息push到kafka集群当中

  • topic:某一类消息的高度抽象,可以理解成某一类消息的集合或一个队列。

  • broker:一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

  • partition:分区的概念,一个topic当中的消息,可以拆分成多个partition分区,存放在多个不同的服务器上,实现数据存放的横向扩展

  • repliaction:副本,所有的partition都可以指定存放几个副本,做到数据的冗余,保证数据的安全

  • segment:每个partiiton由多个segment组成,segment又包含了两部分,一个.log文件,一个是.index文件

  • .log:存放我们的日志文件,所有的数据,最后都以日志文件的形式存放到了kafka集群当中

  • .index :索引文件,所有的.log文件的索引都存放在了这里,便于我们查找某一条日志文件的快速

  • consumer:消费者,消费我们kafka集群当中的消息。

  • offset:偏移量,就是记录的我们消费到了哪一条数据来了 ,kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka

  • Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制-给consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。

6、分布式模型描述

  1. Kafka每个主题的多个分区日志分布式地存储在Kafka集群上,同时为了故障容错,每个分区都会以副本的方式复制到多个消息代理节点上。其中一个节点会作为主副本(Leader),其他节点作为备份副本(Follower,也叫作从副本)。主副本会负责所有的客户端读写操作,备份副本仅仅从主副本同步数据。当主副本出现故障时,备份副本中的一个副本会被选择为新的主副本。因为每个分区的副本中只有主副本接受读写,所以每个服务器端都会作为某些分区的主副本,以及另外一些分区的备份副本,这样Kafka集群的所有服务端整体上对客户端是负载均衡的。
  2. Kafka的生产者和消费者相对于服务器端而言都是客户端。
  3. Kafka生产者客户端发布消息到服务端的指定主题,会指定消息所属的分区。生产者发布消息时根据消息是否有键,采用不同的分区策略。消息没有键时,通过轮询方式进行客户端负载均衡;消息有键时,根据分区语义(例如hash)确保相同键的消息总是发送到同一分区。
  4. Kafka的消费者通过订阅主题来消费消息,并且每个消费者都会设置一个消费组名称。因为生产者发布到主题的每一条消息都只会发送给消费者组的一个消费者。所以,如果要实现传统消息系统的“队列”模型,可以让每个消费者都拥有相同的消费组名称,这样消息就会负责均衡到所有的消费者;如果要实现“发布-订阅”模型,则每个消费者的消费者组名称都不相同,这样每条消息就会广播给所有的消费者。
  5. 分区是消费者现场模型的最小并行单位。如下图(图1)所示,生产者发布消息到一台服务器的3个分区时,只有一个消费者消费所有的3个分区。在下图(图2)中,3个分区分布在3台服务器上,同时有3个消费者分别消费不同的分区。假设每个服务器的吞吐量时300MB,在下图(图1)中分摊到每个分区只有100MB,而在下图(图2)中,集群整体的吞吐量有900MB。可以看到,增加服务器节点会提升集群的性能,增加消费者数量会提升处理性能。
  6. 同一个消费组下多个消费者互相协调消费工作,Kafka会将所有的分区平均地分配给所有的消费者实例,这样每个消费者都可以分配到数量均等的分区。Kafka的消费组管理协议会动态地维护消费组的成员列表,当一个新消费者加入消费者组,或者有消费者离开消费组,都会触发再平衡操作。
    在这里插入图片描述
  7. Kafka的消费者消费消息时,只保证在一个分区内的消息的完全有序性,并不保证同一个主题汇中多个分区的消息顺序。而且,消费者读取一个分区消息的顺序和生产者写入到这个分区的顺序是一致的。比如,生产者写入“hello”和“Kafka”两条消息到分区P1,则消费者读取到的顺序也一定是“hello”和“Kafka”。如果业务上需要保证所有消息完全一致,只能通过设置一个分区完成,但这种做法的缺点是最多只能有一个消费者进行消费。一般来说,只需要保证每个分区的有序性,再对消息假设键来保证相同键的所有消息落入同一分区,就可以满足绝大多数的应用。

转载地址:http://qomen.baihongyu.com/

你可能感兴趣的文章
用WEB标准进行开发
查看>>
[译]关于Android图形系统的一些事实真相
查看>>
J2ME下的Zlib/Gzip/Zip压缩相关
查看>>
Cygwin 的安装配置
查看>>
Cygwin基本命令的使用方法
查看>>
Java本地接口(JNI)编程指南和规范(第二章)
查看>>
有关使用xsl输出csv格式文档的实践小结
查看>>
在Ubuntu 12.04 为 Eclipse 添加快速启动项
查看>>
GCC强大背后
查看>>
Android x86模拟器Intel Atom x86 System Image配置与使用方法
查看>>
shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)
查看>>
【分享】手把手教你使用U盘安装Ubuntu系统
查看>>
Ubuntu下adb无法识别android设备的解决方法
查看>>
使用U盘安装Ubuntu系统的实践小结
查看>>
编译cscope-15.8a遇到的问题与解决方案
查看>>
ubuntu下海信Hisense E920 usb连接不上的处理与adb的连接
查看>>
findbugs的ant脚本实践
查看>>
Ubuntu 12.04 安装 Subversion 1.7
查看>>
scp port 22: Connection refused
查看>>
ubuntu12.04命令行下安装RabbitVCS
查看>>