Kafka
消息队列
生产者-消费者模式
作用:
1、系统之间的解耦合
2、峰值压力缓冲
3、异步通信 (请求与相应都放入队列,client/server只管从队列中取值 或 往队列中写入就可以了)
可靠性保证:
1、自己不丢数据 (根据TTL删除过期数据)
2、消费者不丢数据,两个策略:“至少一次,严格一次”
架构:
producer:消息生产者
consumer:消息消费者
broker: kafka集群的每个节点都是一个server,负责处理消息的读、写请求,存储消息
topic:消息队列/分类 不同类别的消息可按不同的topic区分。
附:kafka集群依赖于zookeeper集群, zookeeper在此处的作用:
1、存储kafka数据的元数据
2、存储消费偏移量(用于保证消费“至少一次,严格一次”)
关于consumer:
1、consumer自己维护消费到哪个offset,即consumer消费完一个消息之后,会自己去zookeeper中更新一下偏移量。注意:
偏移量不是由kafka维护,而是由consumer自己去维护。
2、每个consumer都有对应的group ,如上图。每个消息在一个group内只能被消费一次。
3、多个group之间各自独立消费,互不影响。
关于Topic:
1、一个topic可以分成多个partition(为了做并行读写) , 每个partition对应一个文件,多个partition可以存储在不同的节点上(分布式部署),对每个partition来说,都是顺序写入、顺序读取的(保证读写速度)。
2、每个partition内部的消息强有序,其中的每个消息都有一个序号offset(用于记录消费偏移量)。
3、一个partition只对应一个broker,一个broker可以管多个partition。即partition不能跨节点存在,一个节点可以存储多个partition。
4、消息直接写入文件中,而不是写入内存中。
5、根据时间策略(默认一周)删除,而不是消费完就删除(处理失败时便于重新读取消息)。
6、producer自己决定往哪个partition中写消息, 可以采取轮询写入的策略(推荐:可以避免数据倾斜),也可以采用基于hash的partition策略。
注:虽然对每个partition来说都是FIFO的,但是Topic却不一定是FIFO的,因为在有多个partition的情况下,读取消息的顺序不一定就是写入的顺序。 在topic只有一个partition的情况下,topic就是FIFO的。
Kafka为何高效?
1、顺序读、顺序写;
2、零拷贝 (相比非零拷贝,在文件进行网络传输时,少了两次拷贝过程)
附(了解):什么是零拷贝?
“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。
注:用户空间可以理解为JVM.
非零拷贝:
零拷贝: