kafka
高吞吐量、分布式的发布-订阅消息系统
特性
消息持久化、动态扩容、负载均衡、高吞吐量、可拓展、多语言客户端、kafkastream支持、多种安全机制、可备份、轻量级、可压缩数据。
应用场景
消息系统、应用服务监控系统(kafka+elk)、网站用户行为跟踪(分析日志)、流处理数据。
基本概念
- 消息单元:message和batch
- 消息格式:schema
- 存储模式:topic和partition
- 客户端:consumer和producer
- 服务器:broker和cluster
- topic:主题,每条消息属于一类主题
- producer:发布消息的对象
- consumer:订阅消息的对象
- broker:集群中的某个服务器就是1个broker
- partition:分区,内部有序,且有offset
- offset:偏移量,每个分区有自己的offset,被消费后线性增加,consumer也可以指定offset消费。
两种消息模型
1、队列模型
1条消息只能被一个消费者处理,当消费者组只有1个是,kafka就是队列模型。
2、发布-订阅模型
如果所有的消费者都属于不同的消费者组,即每个消费者组只能有1个消费者,这样某条消息就会被每个消费者订阅到,kafka变为发布-订阅模型。
topic
1个topic是一类消息,根据设置可以被分成多个partition,每个partition又由多个文件组成,每条消息在文件中的位置成为offset(long型),消息写入时追加到文件尾部,由于是顺序写磁盘,因此效率非常高(比随机写内存快),从而保证高吞吐。
有序性
1条消息属于一个topic,而一个topic可能由多个partition存储,每个partition内部是有序的,所以要保证某个topic被顺序消费,该topic只能有1个partition。
消费消息,推还是拉?
- 推:如果推得太快,处理速度跟不上,会积压。如果添加应答、标记数据,太复杂。
- 拉:消费者不停轮训服务端,记录消费的情况只需要在服务器即可。
zookeeper
每个broker会在zookeeper中注册节点,zk负责保存节点的主题、分区状态、消费组、消费进度、分区的所有者等信息。
消息持久化
Kafka 提供两种删除老数据的策略,一是基于消息已存储的时间长度,二是基于分区的大小。
性能
tips:
- 客户端与服务端通过tcp协议进行通信。
- 相同的消费者组中不能有比partition更多的消费者,否则多出的消费者一直处于空等待,不会收到消息。
- 速度保证:磁盘的预读与后写机制,内存作磁盘缓存。
- 数据到哪个分区?
同key在同分区,无key则随机。