什么是kafka
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式流平台。
那什么是流平台呢?流平台有以下三个关键功能:
- 发布和订阅记录流,类似于消息队列或企业消息传递系统
- 以容错的持久方式存储记录流
- 记录发生时处理流
Kafka通常用于两大类应用:
- 构建可在系统或应用程序之间可靠获取数据的实时流数据管道
- 构建转换或响应数据流的实时流应用程序
几个概念
- Kafka作为一个集群运行在一个或多个可跨多个数据中心的服务器上
- Kafka集群以称为主题的类别存储记录流
- 每条记录由一个键,一个值和一个时间戳组成
kafka的特性
高吞吐量、低延迟
:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作可扩展性
:kafka集群支持热扩展持久性、可靠性
:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失容错性
:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)高并发
:支持数千个客户端同时读写
使用场景
日志收集
:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。消息系统
:解耦和生产者和消费者、缓存消息等。用户活动跟踪
:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。运营指标
:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。流式处理
:比如spark streaming和storm
kafka中的核心概念
Producer
:特指消息的生产者Consumer
:特指消息的消费者Consumer Group
:消费者组,可以并行消费Topic中partition的消息Broker
:缓存代理,Kafa 集群中的一台或多台服务器统称为 broker。Topic
:特指 Kafka 处理的消息源(feeds of messages)的不同分类。Partition
:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)Message
:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息Producers(是个动词)
:消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producersConsumers(是个动词)
:消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers
kafka的逻辑架构
- Producer根据指定的partition方法(round-robin、hash等),将消息发布到指定topic的partition里面
- kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
- Consumer从kafka集群pull数据,并控制获取消息的offset
kafka的Producers
- 消息排列分区
1 | Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition(即:生产者可以指定将发送的消息放在一个topic中的partition1,还是partition2中)(注:这种机制可以理解为一种变相的负载均衡,轮转,比如基于"round-robin"方式或者通过其他的一些算法等); |
- 异步发送
1 | kafka支持异步批量发送消息。批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去 |
kafka的broker
- Broker:
(可以把Broker理解为Kafka的服务器)
缓存代理,Kafka 集群中的一台或多台服务器统称为 broker。
1 | kafka中支持消息持久化的,生产者生产消息后,kafka不会直接把消息传递给消费者,而是先要在broker中进行存储,持久化是保存在kafka的日志文件中。 |
Message在Broker中通Log追加
(即新的消息保存在文件的最后面,是有序的)
的方式进行持久化存储。并进行分区(patitions)
为了减少磁盘写入的次数, broker 会将消息暂时 buffer 起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。
kafka的无状态机制
- Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
1 | 注意:Broker没有副本,那broker宕机了怎么解决? |
Broker不保存订阅者的状态,由订阅者自己保存。
无状态导致消息的删除成为难题
(可能删除的消息正在被订阅)
,kafka采用基于时间的SLA(服务水平保证)
,消息保存一定时间(通常为7天)
后会被删除。消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset
(id,即偏移量)
进行重新读取消费消息。
1 | 1.消费者是如何确定,那条消息应该消费,那条消息已经消费了? |
kafka的Message的组成
Message消息:是通信的基本单位,每个 producer 可以向一个 topic
(主题)
发布一些消息Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition
(每个topic有几个partition是在创建topic时指定的)
,每个partition存储一部分Message。partition中的每条Message包含了以下三个属性:
|名称|类型|
|—-|——–|
|offset|long|
|MessageSize|int32|
|data|是message的具体内容|offset偏移量,即消息的唯一标示,通过它才能找到唯一的一条消息
1 | 注意: |
kafka的Partition的分区的目的
kafka基于文件存储.通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;
可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.
越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力.
kafka的Consumers
在kafka中,我们可以认为一个group是一个“订阅者”,一个topic中的每个partitions,只会被一个“订阅者”中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息
(消费者数据小于partitions的数量时)
kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则这些消费者将没有消息可以消费,是一种资源的浪费