一、概述
(一)、kafka的定义
1、定义
1)kafka传统的定义:kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域
2)kafka最新的定义:kafka是一个开源的分布式事件流平台(event stream platform),主要用高性能数据管道,流分析,数据集成和关键任务等领域
2、消息队列
目前市面上大部分公司采用的消息队列主要有kafka,activeMQ,rabbitMQ,rocketMQ等。kafka作为消息队列,主要应用于大数据场景下,而在Javaee开发中更多采用的是activeMQ,rabbitMQ,rockectMQ等。
3、消息队列的应用场景
传统的消息队列的主要应用场景包括:缓冲/削峰,解耦和异步通信
缓冲/削峰:在实际的应用系统中,如果数据生产端(比如其前端)的数据产生的速率与数据处理端(服务端)的数据处理速率相当或小于时,整合系统运行就不会有很大的压力。但是当系统上了个秒杀活动或者双11活动到来,前端用户猛增,数据率随之也会增加数倍,甚至是数十倍。但是服务端需要对数据进行处理,持久化等操作,处理速率必然跟不上数据产生的速度,久而久之系统就会产生数据积压,最终就有可能导致系统的崩溃。在数据生产端和处理端之间使用消息队列就可以解决这种问题。此时,消息队列就发挥了不同系统之间数据的缓冲和削峰的作用。数据生产端将数据发送到消息队列,然后随即返回响应,这个过程相对来说是非常快的。数据处理端则根据自己的处理速度从消息队列中拉取数据。示意图如下:
不使用消息队列的情况
使用消息队列的情况
解耦:允许独立的拓展和修改两边的处理过程,但两边需要确保使用相同的接口约束。
异步通信:将处理的用户数据写入到消息队列中,并立即返回处理结果,队列中数据由另一个线程拉取出来做响应的处理。下面是用户注册,并把注册成功的消息发送到用户手机上的同步处理和异步处理的流程。
(二)、kafka基础架构
1、消息队列的两种模式
1)点对点模式
消费者主动拉取数据,数据消费完后就会在队列中删除
2)发布/订阅模式
可以有有多个主题(topic)
消费者拉取数据消费完后,不删除数据
每个消费者相互独立,都可以消费到数据
2、基础架构
1)producer:消息生产者,就是向broker发送消息的客户端
2)consumer:消息消费者,就是从broker拉取数据的客户端
3)consumer group:消费者组,由多个消费者consumer组成。消费者组内每个消费者负责消费不同的分区,一个分区只能由同一个消费者组内的一个消费者消费;消费者组之间相互独立,互不影响。所有的消费者都属于某个消费者组,即消费者组是一个逻辑上的订阅者。
4)broker:一台服务器就是一个broker,一个集群由多个broker组成,一个broker可以有多个topic。
5)topic:可以理解为一个队列,所有的生产者和消费者都是面向topic的。
6)partition:分区,kafka中的topic为了提高拓展性和实现高可用而将它分布到不同的broker中,一个topic可以分为多个partition,每个partition都是有序的,即消息发送到队列的顺序跟消费时拉取到的顺序是一致的。
7)replication:副本。一个topic对应的分区partition可以有多个副本,多个副本中只有一个为leader,其余的为follower。为了保证数据的高可用性,leader和follower会尽量均匀的分布在各个broker中,避免了leader所在的服务器宕机而导致topic不可用的问题。
8)leader:多个副本的主副本,生产者发送的数据和消费者消费的数据都是通过leader进行处理的。
9)follower:多个副本中除了leader副本,其余的均为follower副本,也即从副本。从副本不会和生产者和消费者提供服务,而是实时同步主副本的数据。当主副本宕机后,通过一定算法选举出新的从副本成为主副本,继续为生产者和消费者提供服务。
(三)、kafka常用命令行操作
1、主题相关
参数 | 描述 |
--bootstrap-server <String: server toconnect to> | 连接的 Kafka Broker 主机名称和端口号。 |
--topic <String: topic> | 操作的 topic 名称。 |
--create | 创建主题。 |
--delete | 删除主题。 |
--alter | 修改主题。 |
--list | 查看所有主题。 |
--describe | 查看主题详细描述。 |
--partitions <Integer: # of partitions> | 设置分区数。 |
--replication-factor<Integer: replication factor> | 设置分区副本。 |
--config <String: name=value> | 更新系统默认的配置。 |
2、生产者相关
参数 | 描述 |
--bootstrap-server <String: server toconnect to> | 连接的 Kafka Broker 主机名称和端口号。 |
--topic <String: topic> | 操作的 topic 名称。 |
3、消费者相关
参数 | 描述 |
--bootstrap-server <String: server toconnect to> | 连接的 Kafka Broker 主机名称和端口号。 |
--topic <String: topic> | 操作的 topic 名称。 |
--from-beginning | 从头开始消费。 |
--group <String: consumer group id> |