kafka概述
定义
Kafka实际是一个全局的队列(queue),环形的数据缓存
当我们的业务变得越来越多,系统间的交互也会越来越复杂,这个时候在两个系统之间加入Apache kafka这个中间层,可以大大减少系统设计的复杂度,同时提高开发的速度和效率。
同时,如果消费者消费的速度远低于生产者生产的速度,系统也不会宕机,数据可以保存在kafka。
常见应用场景
- 消峰,控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
- 流处理(stream processing)
- 解耦(de-coupling of system depentencies),允许独立的扩展或修改两边的处理过程,只要确保遵守相同的接口约束。
- 异步通信, 允许用户把一个消息放入队列,但不立即处理,在需要的时候再去处理它们。
特点
分布式:distributed
低容错:high performance, fault tolerant
低延迟:real time(latency of less than 10ms)
可扩展:resilient architecture,horizontal scalability
核心组成部分
Topics和Partitions
Topics:
a particular stream of data
数据存储的一个单位,可以理解为数据库中的一张表
通过kafka的API在写入和读取的时候,都需要指定topic,可以有很多topic。
Partitions:
一个topic可以有很多个分区,分区内部有序;
每一个分区都有一个不断增加的id,叫做offset;
每一个topic都可以设置自己想要的partition个数。
数据在kafka内默认保存时长是两周,可以进行配置
写入kafka内的数据是不可以被改变的(immutability),没办法更改写入的数据,只能重新写入一个msg,并对应新的offset。
Brokers和Data replications
Brokers
kafka集群由多个borker组成,一般是三个,但也有一些大公司是上百个(可见kafka很好的水平扩展能力);
每一个broker都有一个id,同时每个broker中可能包含不同topic的partions。
当需要与kafka集群连接时,任意连接一个broker(bootstrap broker)都可以成功与kafka集群进行通信。
当需要访问指定topic的指定分区,需要访问指定的broker,但在实际应用中只要访问到集群,kafka就知道我们需要访问的topic partition的位置,从而获取该partition中的数据。
Data replications
topic的partition需要有replication factor(个数一般是大于1),存放在与当前broker不同的broker中,这样当一个broker挂掉的时候,其他的broker可以继续提供服务。
leader for a partition
标星星的是对应parition的leader broker,任何时候一个partition只有一个leader broker。对于partition0,leader broker是broker1,partition1的leader broker是broker2。
任何时候,只能有一个broker做为topic partition的leader
即在cluster中,对应某一个topic partition的leader broker才能接收和发送该partition的数据,其他的brokers只能同步数据。
每一个partition有一个leader,多个ISR(in-sync replica)
两种模式
- 点对点模式
消费者主动拉数据,消息收到后清除消息
- 发布/订阅模式
- 有多个topic主题
- 消费者消费数据后不删除数据
- 每个消费者相互独立,都可以消费到数据