kafka是一个高吞吐的分布式消息系统,底层使用消息队列机制。消息队列常用于系统之间解耦合、峰值压力缓冲、异步通信。kafka的消息队列保证自己不丢数据(kafka接收数据不经内存,直接通过“零拷贝”写入到文件),消费者不丢数据(至少一次,严格一次),kafka会记录消费者读取数据的“offset”位置。
kafka的结构
producer:消息生产者
consumer:消息消费者
broker:kafka集群的server,负责处理消息读、写请求,存储消息
topic:消息队列/分类
kafka的消息存储和生产消费模型
一个topice分成多个partition(分区),kafka里面的消息是由topic来组织的,简单的我们可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition,这个是为了做并行的,在每个partition里面是有序的,相当于有序的队列,其中每个消息都死有序号,比如0到12,从前面读往后面写。这个partition可以很简单想象为一个文件,当数据发过来的时候它就往这个partition上面追加就行
一个partition对应一个broker,一个broker可以管理多个partition:比如说,topic有6个partition,有2个broker,那每个broker就管3个partition
消息直接写入文件,并不是存储在内存中
根据时间策略(默认一周)删除,而不是消费完就删除
producer自己决定往哪个partition里写消息,可以是轮询的负载均衡,或者基于key的hash值
consumer(消费者)自己维护消费到哪个offset(偏移量),每个consumer都有对应的group(组)。group内是queue消费模型,各个consumer消费不同的partition,一个消息在group内只消费一次(避免重复处理)。各个group之间独立消费互不影响
kakfa有哪些特点
消息系统的特点:生产者消费者模型,FIFO(partition内部是FIFO的,partition之间呢不是FIFO的,当然我们可以把topic设为一个parition,这样就是严格的FIFO)
高性能:单节点支持上千个客户端,百MS/s吞吐
持久性:消费直接持久化在普通磁盘上且性能好(做到快速读取在于写入和读取时都是顺序的,这也确定了kafka partition内部的消息是强有序的特点)
分布式:数据副本冗余、流量负载均衡、可扩展
很灵活:消息长时间持久化+Client维护消费状态(Client可以自定义消费偏移量)