目录
8.消费状态两种维护方式比较(Client vs.Server)
一.什么是消息队列
顾名思义,消息队列是一种应用间的通信方式,消息就是是指在应用之间传送的数据,它也是进程通信的一种重要的方式。
1.消息队列的基本架构
- producer:消息生产者。
- broker:消息处理中心。
- consumer:消息消费者。
2.消息队列常用场景
- 系统之间的解耦。
- 高并发下的流量消峰(淘宝双十一等抢购活动)。
- 异步通信(串行变并行)。
3.消息队列的特点
- 基本上都基于生产者消费者模式。
- 必须保证数据的可靠性传输。
4.点对点消息系统
在点对点系统中,消息被保留在队列中。 一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费。 一旦消费者读取队列中的消息,它就从该队列中消失。
5.发布 - 订阅消息系统
在发布 - 订阅系统中,消息被保留在主题中。 与点对点系统不同,消费者可以订阅一个或多个主题并使用该主题中的所有消息。
https://www.w3cschool.cn/apache_kafka/apache_kafka_introduction.html
二.Kafka概述
1.什么是Kafka
Kafka是一个分布式消息队列,它的消息保留在磁盘上,并在群集内复制以防止数据丢失。 它基于构建ZooKeeper服务构建。也可以与Storm和Spark非常好地集成,用于实时流式数据分析。
2.kafka的架构
- producer:消息生产者。
- consumer:消息消费者。
- broker:kafka集群的server,负责处理消息读、写请求,存储消息。
- topic:消息队列/分类。
3.Kafka的消息存储
- 一个topic分成多个partition,每个partition内部消息强有序,其中的每个消息都有一个序号叫offset。
- 一个partition只对应一个broker,一个broker可以管多个partition。
- 消息直接写入文件,并不是存储在内存中。
- 消息根据时间策略删除,而不是消费完就删除(默认一周)。
- producer自己决定往哪个partition写消息,有轮询的负载均衡和基于message<K,V>中K的hash策略两种方式,hash容易造成数据的倾斜,所以推荐轮询。
- kafka里面的消息是有topic来组织的,可以理解为一个队列,为了实现并行,每个topic又分为很多个partition,每个partition都是有序的队列,其中每个消息都有个序号,比如0到12,从前面读往后面写。
- 一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition。
4.Kafka的生产者消费者模型。
- consumer自己维护消费到哪个offset,通过从Zookeeper上拉取,或者自己实现。
- 每个consumer都有对应的group。
- group内是queue消费模型,各个consumer消费不同的partition,一个消息在group内只消费一次,各个group各自独立消费,互不影响。
5.Kafka有哪些特点
- 消息系统的基本特点:符合基本的生存者消费者模型;partition内部是FIFO的,partition之间呢不是FIFO的,当然我们可以把topic设为一个partition,这样就是严格的FIFO。
- 高性能:单节点支持上千个客户端,百MB/s吞吐。
- 持久性:消息直接持久化在普通磁盘上且性能好。直接写到磁盘里面去,就是直接append到磁盘里面去,这样的好处是直接持久话,数据不会丢,第二个好处是顺序写,然后消费数据也是顺序的读,所以持久化的同时还能保证顺序读写。
- 分布式:Kafka本身就是基于集群的,可做数据副本冗余,就是同一份数据可以到不同的broker上面去,也就是当一份数据,磁盘坏掉的时候,数据不会丢失;流量负载均衡;扩展性强。
- 灵活性:消息长时间持久化策略,消费方式非常灵活,第一原因是消息持久化时间跨度比较长,一天或者一星期等;Client维护消费状态,消费状态自己维护消费到哪个地方了,可以自定义消费偏移量。
6.Zookeeper集群的作用
- 存储kafka数据的元数据。
- 存储消费偏移量(用于保证消费“至少一次,严格一次”)
7.Kafka为什么这么快?
- 顺序读,顺序写。
- 零拷贝 (相比非零拷贝,在文件进行网络传输时,少了两次拷贝过程)。
https://blog.youkuaiyun.com/lcgoing/article/details/85231003
零拷贝:“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。 注:用户空间可以理解为JVM。
8.消费状态两种维护方式比较(Client vs.Server)
9.Kafka与其他消息队列中间件对比
- RabbitMQ:分布式,支持多种MQ协议,重量级。
- ActiveMQ:与RabbitMQ类似。
- ZeroMQ:以库的形式提供,使用复杂,无持久化。
- Redis:单机、纯内存性好,持久化较差。
- Kafka:分布式,较长时间持久化,高性能,轻量灵活。