2018-07-26 10:44:36 +08:00

137 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kafka
Apacha [Kafka](http://kafka.apache.org/intro)是一个分布式流媒体平台主要功能有3个
- 发布/订阅 消息流,类似与消息队列
- 以容错的方式记录消息流kafka以文件的方式来存储消息流
- 可以再消息发布的时候进行处理
![](img/143553z1pif7uok8ezr61u.png)
# 简介
## 使用场景
- 在系统或应用程序之间构建可靠的用于传输实时数据的管道,消息队列功能
- 构建实时的流数据处理程序来变换或处理数据流,数据处理功能
- 日志收集一个公司可以用Kafka可以收集各种服务的log通过kafka以统一接口服务的方式开放给各种consumer例如hadoop、Hbase、Solr等。
- 用户活动跟踪Kafka经常被用来记录web用户或者app用户的各种活动如浏览网页、搜索、点击等活动这些活动信息被各个服务器发布到kafka的topic中然后订阅者通过订阅这些topic来做实时的监控分析或者装载到hadoop、数据仓库中做离线分析和挖掘。
## 特性
- 高吞吐量、低延迟kafka每秒可以处理几十万条消息它的延迟最低只有几毫秒每个topic可以分多个partition, consumer group 对partition进行consume操作。
- 可扩展性kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性允许集群中节点失败若副本数量为n,则允许n-1个节点失败
- 高并发:支持数千个客户端同时读写
## 重要概念
![](img/760273-20171108181426763-1692750478.png)
Kafka 每个节点称为brokerproducer负责发送消息consumer负责消费消息。
- 1.Broker:
- 2.topics and logs
Topic即主题通过对消息指定主题可以将消息分类消费者可以只关注自己需要的Topic中的消息
创建一个topic时同时可以指定分区数目分区数越多其吞吐量也越大但是需要的资源也越多同时也会导致更高的不可用性kafka在接收到生产者发送的消息之后会根据均衡策略将消息存储到不同的分区中。
- 3.Producer
生产者向Kafka集群发送消息在发送消息之前会对消息进行分类即Topic上图展示了两个producer发送了分类为topic1的消息另外一个发送了topic2的消息。
Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于"round-robin"方式或者通过其他的一些算法等.
- 4.Consumer
消费者通过与kafka集群建立长连接的方式不断地从集群中拉取消息然后可以对这些消息进行处理。
本质上kafka只支持Topic.每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。
Consumer的两条原则
- 假如所有消费者都在同一个消费者组中那么它们将协同消费订阅Topic的部分消息根据分区与消费者的数量分配保存负载平衡
- 假如所有消费者都在不同的消费者组中并且订阅了同个Topic那么它们将可以消费Topic的所有消息 下面是一个简单的例子,帮助大家理解:
![](img/consumers.png)
上图中有两个Server节点有一个Topic被分为四个分区P0-P4)分别被分配在两个节点上另外还有两个消费者组GAGB其中GA有两个消费者实例GB有四个消费者实例。 从图中我们可以看出首先订阅Topic的单位是消费者组另外我们发现Topic中的消息根据一定规则将消息推送给具体消费者主要原则如下
- 若消费者数小于partition数且消费者数为一个那么它就消费所有消息
- 若消费者数小于partition数假设消费者数为Npartition数为M那么每个消费者能消费的分区数为M/N或M/N+1
- 若消费者数等于partition数那么每个消费者都会均等分配到一个分区的消息
- 若消费者数大于partition数则将会出现部分消费者得不到消息分区出现空闲的情况
## 消息存储
![](img/log_anatomy.png)
谈到kafka的存储就不得不提到分区即partitions创建一个topic时同时可以指定分区数目分区数越多其吞吐量也越大但是需要的资源也越多同时也会导致更高的不可用性kafka在接收到生产者发送的消息之后会根据均衡策略将消息存储到不同的分区中。
![](img/760273-20171108181503075-2011721824.png)
生产者在向kafka集群发送消息的时候可以通过指定分区来发送到指定的分区中也可以通过指定均衡策略来将消息发送到不同的分区中如果不指定就会采用默认的随机均衡策略将消息随机的存储到不同的分区中。
![](img/760273-20171108181730059-1009703405.png)
在消费者消费消息时kafka使用offset来记录当前消费的位置在kafka的设计中可以有多个不同的group来同时消费同一个topic下的消息如图我们有两个不同的group同时消费他们的的消费的记录位置offset各不项目不互相干扰。
对于一个group而言消费者的数量不应该多余分区的数量因为在一个group中每个分区至多只能绑定到一个消费者上即一个消费者可以消费多个分区一个分区只能给一个消费者消费。因此若一个group中的消费者数量大于分区数量的话多余的消费者将不会收到任何消息。
![](img/760273-20171108181923325-686894915.png)
## 消息顺序
每个partition中的消息都是有序的但是partition之间顺序就不能保证了,若topics有多个partition生产者的消息可以指定或者由系统根据算法分配到指定分区若你需要所有消息都是有序的那么你最好只用一个分区。另外partition支持消息位移读取消息位移有消费者自身管理比如下图
![](img/log_consumer.png)
由上图可以看出不同消费者对同一分区的消息读取互不干扰消费者可以通过设置消息位移offset来控制自己想要获取的数据比如可以从头读取最新数据读取重读读取等功能。
## Guaranteens
kafka作为一个高水准的系统提供了以下的保证
- 消息的添加是有序的生产者越早向订阅的Topic发送的消息会更早的被添加到Topic中当然它们可能被分配到不同的分区
- 消费者在消费Topic分区中的消息时是有序的
- 对于有N个复制节点的Topic系统可以最多容忍N-1个节点发生故障而不丢失任何提交给该Topic的消息
## Kafka as a Messaging System
说了这么多前面也讲了消息系统的演变过程那么Kafka相比其他的消息系统优势具体在哪里 传统的消息系统模型主要有两种:消息队列和发布/订阅。
### 消息队列
特性 | 描述
-- | --
表现形式 | 一组消费者从消息队列中获取消息,一条消息会被推送给组中的某一个消费者 |
优势 | 水平扩展,可以将消息数据分开处理 |
劣势 | 消息队列不是多用户的,当一条消息记录被一个进程读取后,消息便会丢失 |
### 发布/订阅
特性 | 描述
-- | --
表现形式 | 消息会广播发送给所有订阅者 |
优势 | 可以多进程共享消息 |
劣势 | 每个消费者都会获得所有消息,无法通过添加消费进程提高处理效率 |
从上面两个表中可以看出两种传统的消息系统模型的优缺点所以Kafka在前人的肩膀上进行了优化吸收他们的优点主要体现在以下两方面
* 通过Topic方式来达到消息队列的功能
* 通过消费者组这种方式来达到发布/订阅的功能
## Kafka as a Storage System
存储消息也是消息系统的一大功能Kafka相对普通的消息队列存储来说它的表现实在好的太多首先Kafka支持写入确认保证消息写入的正确性和连续性同时Kafka还会对写入磁盘的数据进行复制备份来实现容错另外Kafka对磁盘的使用结构是一致的就说说不管你的服务器目前磁盘存储的消息数据有多少它添加消息数据的效率是相同的。
Kafka的存储机制很好的支持消费者可以随意控制自身所需要读取的数据在很多时候你也可以将Kafka作为一个高性能低延迟的分布式文件系统。
## Kafka for Stream Processing
Kafka作为一个完美主义代表者光有普通的读写存储等功能是不够的它还提供了实时处理消息流的接口。
很多时候原始的数据并不是我们想要的我们想要的是经过处理后的数据结果比如通过一天的搜索数据得出当天的搜索热点等你可以利用Streams API来实现自己想要的功能比如从输入Topic中获取数据然后再发布到具体的输出Topic中。
Kafka的流处理可以解决诸如处理无序数据、数据的复杂转换等问题。
# 参考资料
- [官方文档](http://kafka.apache.org/documentation/#gettingStarted)
- [kafka介绍](https://www.cnblogs.com/hei12138/p/7805475.html)