面试角度看kafka

取材于微信公众号《码哥字节》。

讲一讲分布式消息中间件

什么是分布式消息中间件

分布式消息是一种通信机制,与RPC、HTTP、RMI等不一样,消息中间件采用分布式中间代理的方式进行通信。如上图所示,采用了消息中间件之后,上游业务系统发送消息,先存储在消息中间件,让然后右消息中间件将消息分发到对应的业务模块应用(分布式生产者–消费者 模式)。这种异步方式,减少了服务之间的耦合度。

消息中间件的作用

在系统架构中引用额外的组件,必然会提高系统的架构复杂度和运维的难度。那么使用分布式消息中间件有什么优势?消息中间件在系统中又起什么作用?

  • 解耦
  • 数据冗余
  • 扩展性
  • 削峰
  • 可恢复性
  • 顺序保证
  • 缓冲
  • 异步通信

消息中间件的使用场景是什么?异步通信,消息存储处理。

消息中间件选型语言协议、HA、数据可靠性性能事务、生态、简易推拉模式。

kafka基本概念和架构

kafka架构中的一般概念:

  • Producer:生产者。也就是消息发送的一方。生产者负责创建消息,然后将其发送到kafka。

  • Consumer:消费者。也就是接收消息的一方。消费者连接到kafka上接收消息,然后对消息进行处理。

  • Consumer Group:一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式能极大的提高数据下游的处理速度同一消费组不会重复消费消息;同样的,不同消费组中的消费者消费消息时是互不影响的。kafka就是通过消费组的方式实现消息P2P模式广播模式

  • Broker:服务代理节点。Broker是kafka的服务节点,即kafka的服务器

  • Topic:Kafka中的消息以Topic为单位进行划分,生产者将消息发送到特定的Topic,而消费者负责订阅Topic的消息进行消费。

  • Partition:Topic是一个逻辑概念,它可以区分为多个分区每个分区只属于单个主题同一主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)

  • Replication副本。是kafka保证数据高可用的方式,kafka同一partition的数据可以在多个broker上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在broker崩溃或发生网络异常时,kafka会在Controller的管理下重新选择新的Leader副本对外提供读写服务。

  • Record实际写入kafka中并可以被读取的消息记录。每个record包含了keyvaluetimestamp

    kafka Topic Partition (offset) Layout:

kafka将topic进行分区,分区可以并发读写。

Kafka Consumer Offset:

zookeeper

  • Broker注册:Broker是分布式部署并且之间相互独立。zookeeper用来管理注册到集群的所有broker节点。

  • Topic注册:在kafka中同一个topic的消息会被分成多个分区并将其分配在多个broker上,这些分区信息以及与broker的对应关系也都是由zookeeper维护。

  • 生产者负载均衡:由于同一个topic消息会被分区并将其分不到多个broker上,因此,生产者需要将这些消息合理的发送到这些分布式的broker上。

  • 消费者负载均衡:与生产者类似,kafka的消费者同样需要进行负载均衡来实现多个消费者合理的从对应的broker上接收消息。每个消费者组包含若干消费者,每条消息都只会发给一个消费者组中的一个消费者。不同消费者组消费自己topic的消息,互不干扰。

简单讲下kafka架构

producer、Consumer、Consumer Group、Topic、Partition

kafka是推模式还是拉模式,推拉的区别

kafka producer向broker发送消息时push模式,Consumer消费采取的是pull模式。使用拉取模式,让Consumer自己管理offset,可以提供读取性能。

kafka如何广播

Consumer Group

kafka消息是否有序的

Topic级别无序,partition级别有序

kafka是否支持读写分离

不支持。只有leader对外提供读写功能

kafka如何保证数据高可用

主从副本,ack,HW

kafka中zookeeper的作用

对集群的管理,元数据的管理

是否支持事务

0.11后支持

分区数是否可以减少

不可以,不然会丢失数据