学会使用Kafka(一)Kafka基本概念
Kafka初识
Kafka是什么
kafka是消息引擎系统并不是严格意义上的消息队列,它的特点在于高吞吐量,削峰填谷,大流量下防止下游系统链路遭到流量冲击而瘫痪。另外就是解耦。所以Kafka和传统的消息队列比如ActivateMQ或者RabbitMQ是有区别的,它们适用场景也不同。
Kafka具有高吞吐量、高横向扩容以及故障转移,支持幂等性、事务以及三种消息语义,并且具有消息持久化等特点。
Kafka的适用场景:
-
解耦应用,常用于流量的削峰
-
行为跟踪,通过消息来传输用户行为并进行审计
-
日志收集,比如转储Nginx、Tomcat或者其他应用的日志信息,收集代理程序通过读取日志信息并把它变成消息格式,然后发送给Kafka,其他日志分析引擎从Kafka里读取。同类型的有Flume也是类似的,不过在这方面使用Kfaka比较多。
Kafka支持的传输模式
-
点对点:也就是消息队列的模式,A的消息只能B收到,比如常规的电话 A打给B那么它俩的消息就只能在它俩直接传递。在这个模型中Kafka有一个消费者组概念,所谓消费者组就是多个消费者线程共同组成一个组来消费一个主题,每个线程对应消费一个分区,引入这个概念也是为了提高吞吐量(为什么会提高吞吐量呢?因为有分区概念)。如果一个组里面的某个线程挂掉了,那么kafka就会进行rebalance,把这个分区交给其他存活的消费者来消费。需要明确的是一个分区只能被一个消费者组的一个消费者消费,而一个消费者可以消费一个主题的多个分区。
-
发布订阅:就是广播模式,订阅者都可以收到。在一个topic中可以有多个生产者和多个消费者,比如报纸,新闻类型的报刊,可以有多个,而且消费者可以订阅多个新闻类型的报刊。
Kafka支持这2种模式,至于怎么配置后面再说。
Kafka的版本
比如我们下载的包是这样:kafka_2.11-2.2.1.tgz
2.11 是Scala编译器的版本,后面的2.2.1才是kafka的版本
0.8版本以后才加入副本机制;新老API的主要区别在于连接kafka的时候是配置ZK地址还是broker的地址,新版API都是配置broker的地址。
0.8.2.2这个版本比较稳定,其中的老版本consumer API也比较稳定,但是不要用新版本producer API,BUG比较多。
0.9 版本的中的新版本的producer API比较稳定,但是新版本的consumer API不稳定。
0.10 加入了Kafka Streams,但不要在生产中使用,不过该版本的消息引擎功能没问题。建议使用0.10.2.2,该版本的新版Consumer API 和 Producer API都比较稳定。
0.11.0.0 在Producer API中加入了幂等性以及事务,另外就是对kafka消息格式做了重构。增加了幂等性和事务才能使kafka在流处理方面更加得心应手,但是稳定性不好。所以可以使用0.11.0.3这个版本。
对于1.0和2.0主要是针对Kafka Streams做了各种改进。在消息引擎方面没有重大变化。
Kafka的术语
-
消息:Kafka是消息引擎,所以消息就是用户向Kafka写入或者读取的内容
-
主题:是一个逻辑概念,主要用于区分具体业务
-
分区:你可以这么理解就是一块磁盘你分成5个分区,你可以同时读取或者写入5个分区。
-
消息偏移量:表示分区中每条消息的位置信息,是一个单调递增且不变的值
-
副本:就是分区的备份。一个分区是一个读写主体,那么为了冗余我们就给每个分区建立一个或者多个备份,这就是副本。
-
生产者:向主题发送消息的程序。
-
消费者:读取某个主题消息的程序
-
消费者偏移量:记录消费者消费进度的值
-
消费者组:多个消费者组成的一个组,这个组所有的消费者都消费相同的主题
-
重平衡:组内消费者线程和主题分区是一对一的,但是某个消费者线程挂了,那么这样就会引起重新分配。