Kafka概述—消息队列

消息队列的特点:

生产者消费者模式

先进先出(FIFO)顺序保证

可靠性保证:

- 自己不丢数据(Kafka默认是7天)

- 消费者不丢数据:"至少一次,严格一次"

至少一次就是可能会有两次,会重

严格一次机制就是会负责一点


消息队列常见场景:

系统之间解耦合

- queue模型


- publish-subscribe模型


峰值压力缓冲

异步通信



Kafka是一个高吞吐的分布式消息系统

Apache kafka is publish-subscribe messaging rethought as a distributed commit log.


Kafka的架构


producer: 消息的生产者

consumer: 消息消费者

broker: kafka集群的server,负责处理消息读、写请求,存储消息

topic: 消息队列/分类

架构里面有些元信息是存在Zookeeper上,整个集群的管理也和Zookeeper有很大的关系


Kafka的消息存储和生产消费模型


一个topic分成多个partition,每个partition内部消息强有序,其中的每个消息都有一个序号叫offset。

一个partition只对应一个broker,一个broker可以管多个partition。

消息不经过内存缓冲,直接写入文件。

根据时间策略删除,而不是消费完就删除。

producer自己决定往哪个partition写消息,可以是轮询的负载均衡或者是基于hash的partition策略。


Kafka里面的消息是由topic来组织的,可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为多个partition,这个是为了做并行,在每个partition里面是有序的,相当于有序的队列,其中每个消息都有序号offset,从前往后写。

一个partition对应一个broker,一个broker可以管多个partition,比如,topic有6个partition,有两个broker,那每个broker就管3个partition。


这个partition可以很简单想象为一个文件,当数据发过来的时候它就往这个partition上面append,追加就行,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念,这个模型带来了很多个好处。


consumer自己维护消费到哪个offset,每个consumer都有对应的group,group内是queue消费模型,各个consumer消费不同的partition,因此一个消息在group内只消费一次。group间是publish-subscribe消费模型,各个group各自独立消费,互不影响,因此一个消息只被每个group消费一次。



Kafka的特点:

1.消息系统的特点:生存者消费者模型,FIFO

消息系统基本的特点是保证了,有基本的生产者消费者模型,partition内部是FIFO的,partition之间呢不是FIFO的,当然我们可以把topic设为一个partition,这样就是严格的FIFO。

2.高性能:单节点支持上千个客户端,百MB/s吞吐

接近网卡的极限。

3.持久性:消息直接持久化在普通磁盘上且性能好

直接写到磁盘里面去,就是直接append到磁盘里面去,这样的好处是直接持久话,数据不会丢,第二个好处是顺序写,然后消费数据也是顺序的读,所以持久化的同时还能保证顺序,比较好,因为磁盘顺序读比较好。
4.分布式:数据副本冗余、流量负载均衡、可扩展

分布式,数据副本,也就是同一份数据可以到不同的broker上面去,也就是当一份数据,磁盘坏掉的时候,数据不会丢失,比如3个副本,就是在3个机器磁盘都坏掉的情况下数据才会丢,在大量使用情况下看这样是非常好的,负载均衡,可扩展,在线扩展,不需要停服务的。
5.很灵活:消息长时间持久化+Client维护消费状态


有人可能会说kafka写磁盘,会不会是瓶颈,其实不会而且是非常好的,为什么是非常好的,因为kafka写磁盘是顺序的,所以不断的往前产生,不断的往后写,kafka还用了sendFile的0拷贝技术,提高速度,而且还用到了批量读写,一批批往里写,64K为单位,100K为单位,每一次网络传输量不会特别小,RTT(RTT:Round-TripTime往返时间)的开销就会微不足道,对文件的操作不会是很小的IO,也会是比较大块的IO。


0拷贝

从WIKI的定义中,“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页