kafka是用来干嘛的? 一个系统通常拥有许多的应用场景,比如聊天,购物,前端交互等,每个场景的数据进行单独分析的时候需要有各自的队列来搜集数据,然后分发给各自的后台来处理数据,各自的维护成本大,kafka则可以用来解决这些问题,它提供了多个数据的入口,并可以分发给下游多个地方消费
kafka优点有哪些
1、 支持多个生产者
2、 支持多个消费者从一个单独的消息流上读取数据,而且消费者之间不会相互影响。如果消费者群主,可以保证整个群组对每个给定的消息只处理一次
3、 消息可以落地磁盘,如果消费者被关闭了,可以从上次停止的地方继续读取
4、 支持broker的扩展
5、 能保证亚秒级的消息延迟
kafka的基本概念有哪些?
- 消息:kafka的数据单元【相当于表的一条记录】。这个数据没有特别的格式,按照字节存储 消息模式:对字节形式消息的一种结构定义,便于理解
-
批次:一组消息
-
主题:消息的分类
-
分区:消息的记录,一个主题包含多个分区,分区之间不能保证顺序,但是一个分区可保证有序
-
偏移量:消息最后读取的地方
- 消费者群组:一个或者多个消费者共同读取一个主题,它保证一个分区只被一个消费者使用
- 消费者对分区的所有权:消费者与分区之间的映射关系
- broker:一个独立的kafka服务器
常见请求类型?
-
生产请求:生产者发送的请求,包含客户端写入broker的消息。必须发给分区的首领副本。broker接收到生产请求时,会做一些基本验证,比如是否有写入权限?acks值是否有效(消息是否写成功的标志)?acks=all时是否有足够多的同步副本保证消息被安全写入?。然后消息被写入磁盘(linux上消息被写到文件系统缓存,但不保证何时刷到磁盘),kafka不等待写到磁盘上,消息写入分区首领后,broker检验acks,ackas条件满足后,返回给客户端
-
获取请求:从broker读取消息时发的请求。必须发给分区的首领副本。它可以指定请求的偏移量,数据量上限和下限,以及等待累积数据的时长,时长满足但未达到下限仍然可以返回结果。只有当所有的同步副本数据完成后,数据才会发送给消费者,否则返回空
-
元数据请求:客户端获取首领副本的方式。它的请求包含客户端感兴趣的主题列表,响应指明这些主题所包含的分区,每个分区的副本,谁是首领副本(这些信息每个broker都有缓存)
如何处理请求?
1、 kafka提供一个二进制协议,指定请求消息格式。broker会在它所监听的端口上运行Acceptor线程,它会创建连接给processor(网络线程)程处理,processor获取请求消息后扔到请求队列,由IO线程来处理请求,然后结果被写入响应队列,processor从中取出响应给kafka客户端。
2、 kafka客户端一般会缓存各首领副本的信息,当发送请求接受的broker不是首领副本的时候,返回 非分区首领 异常,这时候客户端会先刷新元数据,再重新发送请求(也会有一个时间间隔来定时更新客户端的元数据)
附录
kafka权威指南