什么是kafka?kafka解决了什么问题?已经kafka有什么优点,我们为什么要选择kafka?
一、什么是kafka
(1)、官方定义
kafka简介apache kafka是一个分发数据流平台。这个表达什么含义?
一个流式平台有三个关键的功能:
a、 发布和定义这个流中的消息,这点类似与消息队列或是企业消息系统
b、 能够以容错的方式存储流中的记录。
c、 监听流,当有数据进来时,处理这些数据。
kafka一般广泛应用在两种应用上:
a、 建立一个实时的数据流,可以使得不同的应用或是系统获取这些数据
b、 建立一个实时的流式应用处理流的数据。
(2)、自己的理解
kafka 可以作为一个消息发布订阅系统,接受一些应用产生、发送过来的消息,并允许另一些应用监听这些数据,然后获取并处理这些数据。kafka可以把消息数据存储一段时间。
kafka可以实时接受数据并处理数据。
但是这些特点现有的的消息中间例如RabbitMQ,ActiveMQ就可以实现,那么为什么会有kafka呢?kafka的出现必然是为了解决一定的业务场景,肯定有具有RabbitMQ、ActiveMQ没有的有点。接下来来聊聊kafka试用的业务场景。
二、kafka解决的问题
假设我们都已经理解了什么是消息中间件和消息中间件的一些基础知识,如果这部分空白的话可以看下我的另外两篇博客,《消息中间件基础-何为消息中间件》《消息中间件基础-AMQP》。
kafka的设计初衷做一个信息收集处理平台,它能够实时的收集数据,并且能经受的起海量数据的冲击和具备良好的容错能力。
我们都知道像ActiveMQ、RabbitMQ设计都遵循了AMQP原则,对数据一致性、可靠性、稳定性要求高,对吞吐量和性能要求其次。
kafka一般解决的场景是收集大量的行为日志或是系统运行日子,要求高吞吐量,对可靠性、和数据一致性要求在其次。
所以kafka不是前两者的替代品,只是关注点不同。
三、kafka组成
1、生产者
生产者顾名思义,数据的生产者。生产者将消息发送到kafka上特定的topic上,这些消息均匀的分布在该主题的分区上。当然也可以发送到特定的分区上,只要实现自己的键序列化器和分区器。
2、消费者
消费者,数据的处理者,应用程序从kafka特定的topic上拉取消息。
消费者可以订阅一个或是多个topic,并且按照消息生成的顺序去消费他们。消费者会通过消息的偏移量来判断当前消息是否消费过。一般这个消息偏移量保存到zookeeper或是redis,避免消费者重启导致重复消费消息。
另外对于一个主题topic来说,一个主题可能有n个分区,同样也有可能有m个消费者组成的消费者群组来消费当前主题。当n>m时,有的消费者会消费一个指定分区,有的消费者会消费多个指定分区。总之,一个分区只会被一个分组中的一个消费者来消费。
3、broker和集群
一个kafka服务器称为一个broker,broker接收来着生产者的消息,为消息设置偏移量,并把消息保存到磁盘。(为消息设置偏移量,就是表明当前消息的长度、大小)
当消费者读取特定主题的消息时,实际是broker接收到该读的消息,并把消息分发到指定的分区。分发到指定的分区,需要根据键的序列化器、和分区器来找到指定的分区。
对于单个分区而言,在多个broker情况下,一个分区从属于一个broker,该broker称为这个分区的首领,但是该分区在其他broker下存在备份。当首领broker宕机时,分区会推选出新的首领broker。但是这种情况存在消息复制,多份消息就会造成消息冗余。
另外,刚才说到,broker接收到生产者的消息后,把消息保存到磁盘,这个算是kafka的一个优点:消息保留。消息保存的时长一般有两个维度来决定,一个是kafka设定的消息的保存的时长,另外一个是消息的大小,当消息保存的大小达到指定配置时也会删除该消息。
集群
集群出现的原因如下:
容灾,建立多个数据中心
数据的安全性考虑
数据类型的分离。
好了,到此简单介绍了一下kafka,算是一个基本了解。本篇提到的几个概念:
生产者、消费者、broker、分区、集群、数据复制 会在接下来的博客中详细讲诉。
网友评论