背景
不同的服务器为了平衡不能的处理能力,降低耦合,平衡两者的处理能力的不同,分布式消息队列就出现了
kafka 的设计动机
- 数据的生产者和消费者的耦合度过高
- 生产者和消费者的数据处理速率不同
- 大量的并发的网络连接对后端消费不太友好
kafka可应用的领域
- 消息中间件
- 消息队列(不同于activemq 等单机消息队列)
- 发布订阅系统
- 消息总线
kafka 的特点
kafka是在大数据的背景下产生的,能应对海量的数据
- 高性能
(单机相同配置的情况下 kafka 比 rabbitmq 的性能高40-50倍) - 良好的扩展性
因为kafka 是分布式的,相比较单节点的就会有可扩展和容错的特点 - 数据的持久性
数据消息会持久化到磁盘上
kafka的基本架构
- kafka 架构是由producer、broker、consumer 三个组件构成
- producer将数据写入broker,consumer将数据从broker中读出来
- broker构成了连接producer和consumer的缓冲区
- broker和consumer是通过zookeeper来作为协调的(kafka从0.9.0版本开始后,consumer不再依赖于zk)
- 多个broker构成了一系列的数据存储系统,可以防止数据丢失
- broker中的消息被分为多个topic
- 同属于一个topic的消息被分为多个partition
- kafka 不同于其他消息的push-push架构,而是push-pull架构
- producer将数据push给broker,而broker上的数据是 consumer通过pull从broker上获取的
这样设计的优势是:
1、consumer 可以根据自己的需要从broker上获取,避免push形成的压力过大
2、consumer可以自己读取消息,并记录自己的消息offset,大大降低了broker的压力
kafka各组件详解
kafka producer
在kafka中每条消息包含
- topic
划分消息的概念 - key
消息的主键,kafka会根据主键,将同一topic下的消息划分为不同的partition(默认时采用hash取模
),patition的数量是创建topic的时候静态制定的 - messege
消息的实体,可以是字符串,也可以是json ,avro,thrift等
kafka broker
- 在kafka中一般会有多个broker,多个broker构成一个分布式的高容错集群
- 将数据持久化到磁盘上
- broker将topic分成好几个分区(partition),每个分区会有多个副本,这些partation只有一个leader,其他都是follower,只有leader对外服务,follower不对外服务,只保证和leader的数据一致,当leader宕机后,就会选举其他的leader
- broker可以将同一partiton内部的消息是有序的,但无法保证全局的partition消息有序
- broker会给每个partition一个offset(偏移量),offset由各自的consumer来维护,每次取消息告诉broker消息的offset
- broker的消息在磁盘中的默认保存时7天,时间一到就会清除数据来释放磁盘
kafka consumer
- consumer 自己保存offset,并向broker拉数据(不同于activemq,rabbitmq),
- kafka允许consumer构成一个consumer group来提高效率
kafka zookeeper
- broker与zookeeper
broker将topic ,partition 等信息写入zookeeper ,zk来监控健康状态 - consumer 与zookeeper
consumer group通过zk 来保证每个consumer的负载均衡
kafka 关键技术点
可控的可靠性级别
- producer向broker中写数据时,分为同步和异步,异步一般都可提高效率
- 当producer向broker传输消息时,可靠性应答可通过参数 request.required.acks = ?来设定
参数为0 时,当producer向broker 写数据时,无序确认就返回
参数为1时,当producer向broker写数据时,当只要partition的leader写入成功后就放回
参数为-1时,当producer向broker写数据时,所有patition的所有副本都写入成功就放回
数据的多副本
- kafka 的broker的patition的复制先复制到leader上,然后在依次复制,当leader所在服务器出现异常时,选举机制就会选举别的follower为leader
kafka高效的持久化机制
- kafka是直接将数据持久化磁盘而不是内存,这要求有高效的读写速度,实际上,数据写入磁盘时,顺序读写的速度远远高效于随机(写入快,寻址慢)
数据传输优化
可控的消息传递语义
在消息系统中,根据接收者可能受到重复消息的次数,将消息传递语义分为三种
- at most once:发送者将消息发送之后 立刻返回,并不关心接收者是否接收
- at least once:发送者将消息发送后,等待确认,如果没有受到确认,则重复发送
- at exactly once:消费者只会处理消费一次(两端锁协议和支持幂等协议)