Kafka简介

网址:http://www.kafka.cc ,对kafka的知识介绍比较详细,可以参考学习。

一、消息队列(Message Queue)

消息 Message
网络中的两台计算机或者两个通讯设备之间传递的数据。例如说:文本、音乐、视频等内容。
队列 Queue
一种特殊的线性表(数据元素首尾相接),特殊之处在于只允许在首部删除元素和在尾部追加元素。入队、出队。
消息队列 MQ
消息+队列,保存消息的队列。消息的传输过程中的容器;主要提供生产、消费接口供外部调用做数据的存储和获取

MQ分类
MQ主要分为两类:点对点(p2p)、发布订阅(Pub/Sub)
共同点:
消息生产者生产消息发送到queue中,然后消息消费者从queue中读取并且消费消息。
不同点:
p2p模型包括:消息队列(Queue)、发送者(Sender)、接收者(Receiver)
一个生产者生产的消息只有一个消费者(Consumer)(即一旦被消费,消息就不在消息队列中)。比如说打电话。

Pub/Sub包含:消息队列(Queue)、主题(Topic)、发布者(Publisher)、订阅者(Subscriber)
每个消息可以有多个消费者,彼此互不影响。比如我发布一个微博:关注我的人都能够看到。
那么在大数据领域呢,为了满足日益增长的数据量,也有一款可以满足百万级别消息的生成和消费,分布式、持久稳定的产品——Kafka。
二、消息系统使用场景
解耦:各系统之间通过消息系统这个统一接口交换数据,无须了解彼此的存在
冗余:部分消息系统具有持久化能力,可以规避消息处理前丢失的风险
扩展:消息系统是统一的数据接口,各系统可独立扩展
峰值处理能力:消息系统可以顶住峰值流量,业务系统可根据处理能力从消息系统中获取并处理
可恢复性:系统中部分组件失效并不会影响整个系统,它恢复后仍可以从消息系统中获取并处理
异步通信:在不需要立即处理请求的场景下,可以将请求放入消息系统,合适的时候再处理

三、Kafka设计目标
高吞吐率:在廉价商用机器上单机可支持每秒100万条数据的读写
消息持久化:所有l消息均被持久化在磁盘,无消息丢失,支持消息重放
完全分布式:生产者、kafka broker、消费者均支持水平扩展
适应在线流处理和离线批处理

四、Kafka的逻辑架构
在这里插入图片描述
Kafka通过Zookeeper管理Kafka集群配置:选举Kafka broker的leader,以及在Consumer Group发生变化时进行rebalance,因为consumer消费kafka topic的partition的offset信息是存在Zookeeper的。

一个典型的 kafka 集群包含若干 Producer,若干个 Broker(kafka )、若干个 Consumer Group,以及一个 zookeeper 集群。kafka 通过 zookeeper 管理集群配置及服务协同。Producer 使用 push 模式将消息发布到 broker,consumer 通过监听使用 pull 模式从 broker 订阅并消费消息。

多个 broker 协同工作,producer 和 consumer 部署在各个业务逻辑中,三者通过 zookeeper 管理协调请求和转发。这样就组成了一个高性能的分布式消息发布和订阅系统。

和其他 mq 中间件不同的是,producer 发送消息到 broker 的过程是 push,而 consumer 从 broker 消费消息的过程是 pull,consumer主动去拉数据,而不是 broker 把数据主动发送给 consumer。

基本概念:
topic(主题)

这里写图片描述

每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处
逻辑概念,同一个topic的消息可以分布在yig一个或多个broker节点上
一个topic包含一个或多个partition
每条消息都属于且仅属于一个topic
producer发布数据时,必须指定将消息发布到哪一个topic
consumer订阅消息时,必须指定订哪个topic的消息

partition(分区)
topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列
message(消息)
是通信的基本单位,每个producer可以向topic发布一些消息
producer(生产者)
消息和数据的生产者,负责发布消息到Kafka broker 。生产者支持消息的压缩。生产者发送消息时,支持同步(返回确认消息ack)和异步的方式
consumer(消费者)
消息消费者,向Kafka broker读取消息的客户端。

consumer group(消费者组)
消息被消费后,并不会被删除,由消息保存策略决定什么时候删除,默认保存7天,或超过设置的分区大小,offset加1
对与每条消息,在同一个consumer group里只会被一个consumer消费
不同consumer group可以消费同一条消息
这里写图片描述

五、个人理解

这里写图片描述
同一个分区,消息是先进先出的模式(FIFO)被消费的,因此,kafka可以保证同一个分区里的消息是有序的。也就是说,如果生产者按照一定的顺序发送消息,broker就会按照这个顺序把它们写入分区,消费者也会按照同样的顺序读取它们。
1、生产者发送一条消息到kafka的topic,消息带有key,且未指定分区
会基于该key和分区数,计算一个分区值,该值即为消息存放的分区;同一个key,始终会存放在同一个分区(分区大小可以自定义),因此,可以保证同一个key的消息顺序性执行

2、生产者发送一条消息到kafka的topic,消息未带有key,且未指定分区
会基于kafka的存放策略存放,如在各个分区见轮询存放,或都存放在默认分区。此时,消息存放具有随机性,因此,无法保证消息的顺序执行。

3、生产者发送一条消息到kafka的topic,指定分区
消息存放在指定分区

4、若为设置消息中为带key,且希望保证消息的顺序
只能为toipc设置一个partition

5、生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值,然后存储至磁盘。
Kafka集群会保存所有的消息,不管消息有没有被消费;我们可以设定消息的过期时间,只有过期的数据才会被自动清除以释放磁盘空间。比如我们设置消息过期时间为2天,那么这2天内的所有消息都会被保存到集群中,数据只有超过了两天才会被清除。
Kafka需要维持的元数据只有一个–消费消息在Partition中的offset值,Consumer每消费一个消息,offset就会加1。其实消息的状态完全是由Consumer控制的,Consumer可以跟踪和重设这个offset值,这样的话Consumer就可以读取任意位置的消息。
kafka有应答机制来保证消息发送或消费失败的场景。

6、一个主题的各分区按一定策略分配给同一个组中的消费者,如轮询策略,但是需要注意不论采用什么策略,```每个分区都只被同一个组中的一个消费者消费,一旦分配给一个消费者,则一直被该`消费者消费,除非触发分区再分配机制(如运行过程中,增加分区、删除分区、增加消费者等)。若一个组中的消费者多于分区数,则超过数量的消费者不会被分配分区,一直空闲。

7、生产者客户端的处理流程:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值