(一)Kafka概述
目录
前言
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
一、Kafka是什么(定义)?
定义:
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。(传统使用)
Kafka是一个开源的分布式事件流平台(event streaming platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。(最新定位)
重点提取:
-
Kafka是一个分布式
-
基于发布/订阅模式的消息队列(Message Queue)
-
主要应用于大数据实时处理领域。(传统使用)
-
是一个开源的分布式事件流平台。
二、消息队列
1.传统应用场景(同步和异步的对比)
由此可见:同步处理的场景——用户需要等待系统走完所有的流程才能得到响应。体验很差。
异步处理:只需要将请求数据放入到消息队列即可。
2.使用消息队列的好处:
-
解耦性:允许你独立的扩展或修改两边的处理过程,只要确保他们遵守同样的接口约束。
-
可恢复性:系统的一部分组件失效时,不会影响到整个系统,消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
-
缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的速度不一致的问题(一般用在生产消息大于消费消息的场景)
-
灵活性&峰值处理能力:突发的访问量剧增的场景(偶然或者特定的短时间内发生)。系统能够借助于消息队列在不大量增加集群的机器数量(资源)的情况下应对访问压力。
-
异步通信:允许用户把一个消息放入队列,但并不需要立即处理它,想向队列中放入多少消息就放多少消息,然后在需要的时候再去处理他们。
3.消息队列的模式(两种)
(1)点对点模式(一对一,消费者主动拉取数据,消费者收到消息后队列中的消息会被清除)
消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。
消息被消费以后,Queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
(2)发布/订阅模式(一对多:消费者消费数据之后,队列中的消息不会清除)
Kafka是发布订阅模式。消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息可以被所有订阅者消费。
常见的消息队列:
现在比较常见的消息队列产品主要有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka等。
各个消息队列横向对比
ActiveMQ与RabbitMQ在很多方面都很相似,但ActiveMQ对非JAVA生态的支持不及rabbitMQ。
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
PRODUCER-COMSUMER | 支持 | 支持 | 支持 | 支持 |
PUBLISH-SUBSCRIBE | 支持 | 支持 | 支持 | 支持 |
REQUEST-REPLY | 支持 | 支持 | 支持 | - |
API完备性 | 高 | 高 | 低(静态配置) | 高 |
多语言支持 | 支持,JAVA优先 | 语言无关 | 支持 | 支持,JAVA优先 |
单机呑吐量 | 万级 | 万级 | 单机万级 | 十万级 |
消息延迟 | - | 微秒级 | - | 毫秒级 |
可用性 | 高(主从) | 高(主从) | 高 | 非常高(分布式) |
消息丢失 | - | 低 | - | 理论上不会丢失 |
消息重复 | - | 可控制 | - | 理论上会有重复 |
文档的完备性 | 高 | 高 | 中 | 高 |
提供快速入门 | 有 | 有 | 无 | 有 |
首次部署难度 | - | 低 | 高 | 中 |
由此可见Kafka是一个性能高,功能全面的消息队列。
三、Kafka基础架构
1)Producer :消息生产者,就是向kafka broker发消息的客户端;
2)Consumer :消息消费者,向kafka broker取消息的客户端;
3)Consumer Group (CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个topic下的一个分区只能被一个消费者组内的一个消费者所消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
4)Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
5)Topic :可以理解为一个队列,生产者和消费者面向的都是一个topic;
6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列;
7)Replica:副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower。
8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。
9)follower:每个分区多个副本中的“从”,实时从leader中同步数据,保持和leader数据的同步。leader发生故障时,某个follower会成为新的leader。