kafka概述
kafka是分布式消息队列,大体结构如下
- topic(主题):消息按照主题归类,主题之间的数据是隔离的
- Producer(发送消息者)
- Consumer(消息接受者)
- broker:kafka集群每个实例(server)
- zookeeper:kafka集群,producer,consumer都依赖于zookeeper来保证系统可用性,保存一些meta信息
kafka特点
- 高吞吐量: Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。花了很多功夫去保证对磁盘的读写是连续的,不是随机的,保证读写的速度
- 持久化数据存储:可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费
- 分布式系统易于扩展:所有的 producer、broker 和 consumer 都会有多个,均为分布式的
- 客户端状态维护:客户端与服务端通信中所需要记录的信息或状态,都由客户端自己去存储及维护,服务端只负责提供读写。这样可以让客户端非常灵活。
主题(topic)
- 主题逻辑结构:借助图书馆来理解,不同房间(主题)放不同类型的书籍,每个房间有很多书架(分区),每个书架上的书籍都有自己的唯一编号(消息的序列号:offset),并有序(消息是连续有序的)的放在书架上。
- kakfa消息清除机制:传统的消息队列是消费过的消息会被实时删除,而kafka是配置一个时间T,消息发布时间超过T后,则被批量清除,与消费无关。
- kafka常量级性能:Kafka的性能只与硬盘读写速度有关,因为只需磁头第一次定位,后续都是连续读写
- 分区实现负载均衡和失败恢复:每个分区有多个副本(数量可配置),并以分区为单位来划分leader和follwer,这样把ledaer分散到各个机器,充分利用所有机器的性能。leader负责写和读,其他的follwers只负责读,并同步leader的数据,防止多个副本同时写数据的混乱问题。
生产者(producers)
Producer将消息发布到它指定的topic中,并负责决定发布到哪个分区。通常简单的由负载均衡机制随机选择分区,但也可以通过特定的分区函数选择分区。
消费者(consumers)
offset由consumer来维护,一般情况下随着consumer不断的读取消息,这offset的值不断增加,但consumer可以将offset设置成为一个旧的值来重读之前的消息。
消费者组,消费者里可以加入消费者组。
组内是竞争关系(多个消费者形成一个集群,解决单点故障),队列模式,模拟传统的消息队列。
组间是共享关系(不同的消费者,构建各自的集群),发布订阅模式
有序性
传统的消息队列,当多个consumer同时消费消息,服务器会按顺序向consumer分发消息。但是消息到达各个comsumer时可能已经失去了原来的顺序,所以只允许一个消费者消费消息。
Kafka将每个分区分只分发给一个consumer组,只要consumer组的数量不多于分区的数量即可并发访问。