一,kafka概述
1.1定义
kafka是一个分布式的基于发布/订阅模式(publish/subscibe)又叫观察者模式(Observer)的消息队列,主要应用于大数据实时处理领域。
一.异步通信原理
1.1观察者模式
- 观察者模式(observer),又叫发布-订阅模式(publish/subscribe)
- 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会得到通知并自动更新。
- 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
1.2生产者消费者模式
- 传统模式
生产者直接将消息传递给指定的消费者
耦合性特别高,当生产者或者消费者发生变化,则需要重写业务逻辑
- 生产者消费者模式
通过一个容器解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过组塞队列来进行通讯。
- 数据传递流程
生产者消费者模式,即 n个线程进行生产,同时n个线程进行消费两种角色通过内存缓冲区进行通信。
生产者负责向缓冲区里面添加数据单元
消费者负责从缓冲区里面取出数据单元(一般遵循先进先出原则)
1.3缓冲区
- 解耦
假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖
- 支持并发
- 支持忙闲不均
1.4数据单元
- 关联到业务对象
- 完整性
- 独立性
- 颗粒度
二.消息系统原理
一个消息系统负责将数据从一个应用传递到另一个应用,应用只需要关注于数据,无需关注数据在两个或者多个应用间是如何传递的。
2.1点对点消息传递
在点对点消息系统中,消息持久化到一个队列中。此时,将有一个或多个消费者消费队列中的数据。但是一条消息只能被消费一次
当一个消费者消费了队列中的某条数据之后,该条数据则从消息队列中删除。
该模式即使有多个消费者同时消费数据,也能保证数据处理的顺序。
基于推送模型的消息系统,由消息代理记录消费状态。
消息代理将消息推送(push)到消费者后,标记这条消息为已经被消费,但是这种方式无法很好地保证消费的处理语义。
2.2发布订阅消息传递
在发布-订阅消息系统中,消息被持久化到一个topic中。
消费者可以订阅一个或多个topic消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。
在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。
Kafka采取拉取模型(Poll),由自己控制消费速度,以及消费的进度,消费者可以按照任意的偏移量进行消费。
3.kafka简介
官网:http://kafka.apache.org/
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
3.1 设计目标
- 以时间复杂度O(1)的方式提供消息持久化能力,即使对tb级以上数据也能保证常数时间的访问性能
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100k条消息的传输。
- 支持kafka server间的消息区分,及分布式消费,同时保证每个partition内的消息顺序传输
- 同时支持离线数据处理和实时数据处理。
- 支持在线水平扩展。
3.2 kafka的优点
解耦
冗余
扩展性
灵活性 峰值处理能力
可恢复性
顺序保证
缓冲
异步通信
4. kafka系统框架
4.1 broker
kafka集群包含一个或多个服务器,服务器节点成为broker.
4.2 topic
每条发布到kafka集群的消息都有一个类别,这个类别被称为topic
类似于数据库表的表名或者es的index
物理上不同topic的消息分开存储
逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处
创建流程
4.3partition
topic 中的数据可分为一个或多个partition
每个topic至少有一个partition,当生产者产生数据的时候,根据分配策略,选择分区,然后将消息追加到指定的分区的末尾(队列)
##Partition数据路由规则
1.指定了partition,则直接使用
2.未指定partition,但指定key,通过对key的value进行hash选出一个partition
3,未指定partition和key,使用轮询选出一个partition
每条消息都会有一个字增的编号
- 标识顺序
- 用于标识消息的偏移量
每个partition中的数据使用多个segment文件存储。
partition中的数据是有序的,不同的partition间的数据丢失了数据的顺序
如果topic有多个partition,消费数据时就不能保证数据的顺序。严格保证消息的消费顺序的场景下,需要将partition数目设置为1
4.4leader
4.5 follower
4.6 replication
4.7