Kafka基础之入门测试 (1)

(Kafka基础篇)Kafka 简单问答 1

Kafka之前就有很多优秀的消息队列系统了,比如ActiveMQ、RabbitMQ等。
但传统的消息系统一般吞吐量都比较低,在大数据应用中,有海量的数据需要处理,
对消息的吞吐量要求很高,传统的消息队列系统无法胜任,这时候Kafka就出现了。

Kafka可以起到两个作用:
作用一、降低系统组网复杂度。
作用二、降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,
Kafka承担高速数据总线的作用。

1、什么是kafka?

答:是一个分布式发布-订阅消息系统和一个强大的队列,适合离线和在线消息消费,
扩展性特别好。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,
消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。
Kafka消息保留在磁盘上,并在集群内复制以防止数据丢失。

2、Kafka的特性。Kafka为什么比其他的MQ都快?

答:采用的是机制是顺序写入磁盘和Memory Mapped Files(内存映射文件)。
顺序写入:每个partition都是一个文件,kafka会把收到的message插入到文件末尾,
每个consumer会对每个topic都有一个offset用来表示读取到了第几条数据。
kafka会把所有的数据都保留下来,但是数据落到磁盘后,会随着数据增加,而选择要不要删除,
kafka目前提供两种机制来删除,一种是基于时间的,数据默认保留7天,一种是基于partition文件大小的。
Kafka不是实时的写入硬盘,充分利用操作系统的分页存储来提高I/O操作。
64位操作系统中一般可以表示20G的数据文件,
它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。
完成映射之后你对物理内存的操作会被同步到硬盘上。

3、Kafka的使用场景有那些?

答:
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,
通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,
如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,
然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,
生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
- 事件源

4、解释一下topic和partition的概念。

答:
前者是主题,具有某种相同逻辑意义的一类消息,也是这类消息存放的目录,
Kafka集群能够同时负责多个topic的分发。
后者是分区,它是topic物理上的分组,一个topic可以分为多个partition,
每个partition在逻辑上是一个有序的队列。在物理存储层面来看,
每个Partition是一个append log文件,任何被发布到该partition的message都会被追加到log文件的尾部,
message在log文件中的位置称为offset,offset唯一标记一条消息。
分区被分布在kafka集群中的多个server上,以提高topic的分发性能。
kafka对外使用topic的概念,生产者往topic里写消息,消费者从读消息。
遇到瓶颈时,可以通过增加partition的数量来进行横向扩容。单个parition内是保证消息有序。

5、围绕消费者组(Consumer Group)谈谈你的理解。

答:
Consumer组成的Group。Partition中的每个message只能被同一个组中的某一个Consumer消费,
如果一个message被多个consumer消费的话,这些consumer必须属于不同的组。
也就是说一个Consumer Group要消费一个Topic的所有Partition的所有message,
一个message不能被同一个组内的消费者重复消费。

6、Kafka是如何做到既高效又持久地保持消息的?

答:
kafka使用文件存储消息,Kafka并没有提供太多高超的技巧,
文件缓存/直接内存映射、压缩后传输等是常用的手段。因为kafka是对日志文件进行append操作,
因此磁盘检索的开支是较小的;同时为了减少磁盘写入的次数,broker会将消息暂时buffer起来,
当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。
对于producer端,可以将消息buffer起来,当消息的条数达到一定阀值时,批量发送给broker。

7、围绕Offset概念,谈谈你的理解。

答:
某个或某组consumer读取某个partition的偏移量。 同一个partition不同的consumer有不同的offset。
同时consumer有个组的概念,使用同一个group id,也就是同属于某个组的consumer,共用offset。

8、实际开发中 Kafka 有四个核心API,请简单介绍一下。

答:
Producer API :该接口允许应用发布一个流数据到一个或多个 topics。
Consumer API :该接口允许应用订阅一个或多个 topics 然后处理这些 topics 中的流数据。
Streams API :该接口允许应用作为一个 流处理器(stream processor) ,
从一个或多个 topics 的输入流中消费数据,然后转换并生产数据到一个或多个 topics 的输出流中。
Connector API :该接口允许构建和运行可重用的生产者(Producer)或者消费者(Consumer),
这些生产者或消费者将Kafka中的 topics 和现有的应用或者数据系统(如数据库)连接起来。
比如一个 connector 可以连接到一个关系型数据库从而可以捕捉到数据表中的任何变化,然后进行响应的处理。

9、传统的企业消息系统有那两类,他们的优缺点是什么?

答:消息传统上有两种模型:队列和发布 - 订阅。
在队列中,消费者池可以从服务器读取并处理数据个;
在发布 - 订阅中,数据被广播给所有消费者。
这两种模型中的每一种都有优点和缺点。
队列的优势在于它允许在多个消费者实例上处理数据,从而可以扩展数据的处理。
但是,队列不是多用户的,一旦一个消费者读取数据,该数据就被使用。
发布 - 订阅允许将数据广播到多个订阅者,但由于每条消息都发送给每个订阅者,因此无法进行扩展处理。

10、Kafka模型相比传统消息系统的优势?

答:
Kafka 的消费者组概念概括了传统消息系统的两个概念。
与队列一样,消费者组允许将数据处理划分为一组进程。
与发布 - 订阅一样,Kafka 允许向多个消费者组广播消息。
它可以扩展数据处理并且也是多用户的,同时Kafka 有更强的顺序保证。
具体地有,
在 Kafka 中。通过在 topic 中具有并行性概念 分区 ,
Kafka 能够在消费者流程池中提供顺序保证和负载均衡(保证了独占也保证了并发)。
这是通过将 topic 中的分区分配给消费者组中的消费者来实现的,以便每个分区仅由该组中的一个消费者使用。
这样,就可以确保消费者是该分区的唯一读取者并按顺序使用数据。
由于有许多分区,便可以平衡许多消费者实例的负载。
特别注意的是,
消费者组中的消费者实例不能超过分区。

11、消息从生产到消费的流程是怎样的?

答:
流程大致可分三步
第一步:
生产者Producer根据指定的partition方法(round-robin、hash等),
	将消息发布到指定topic的partition里面。
第二步:
商人kafka集群接收到Producer发过来的消息后,
	将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
第三步:
消费者Consumer从kafka集群pull数据,并控制获取消息的offset。

12、围绕Kafka的设计要点,谈谈为什么Kafka实现了大吞吐量。

答:
采用了显式分布式架构,Producer,consumer实现Kafka注册的接口,
broker承担一个中间缓存和分发的作用,相当于活跃的数据和离线处理系统之间的缓存,这些设计均有利于扩展。
数据磁盘持久化:消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能。
zero-copy:减少IO操作步骤,支持从内核直接拷贝到网卡buffer中。
数据批量发送:会刻意筹够一定数量再发送。
数据压缩:对微小的数据记录打包后再压缩。

13、Kafka是如何在大吞吐量下做到有序性的?

答:
简单地来说是通过分区来实现的,消费者并发读取不同分区的消息。
详细地有
通过分区的概念,Kafka可以在多个consumer组并发的情况下提供较好的有序性和负载均衡。
将每个分区只分发给一个consumer组,这样一个分区就只被这个组的一个consumer消费,
就可以顺序的消费这个分区的消息。因为有多个分区,依然可以在多个consumer组之间进行负载均衡。
注意consumer组的数量不能多于分区的数量,分区数限制了最大并发消费。
Kafka只能保证一个分区之内消息的有序性,如果需要topic中所有消息的有序性,
那就只能让这个topic只有一个分区。

14、Producer和broker之间如何实现负载均衡?

答:
他们自己无法实现,得借助zookeeper进行负载均衡。
所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。
如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。
在新版本的Kafka中已内置Zookeeper。 

15、Kafka有3次较大的版本改进,你可以说一下吗?

答:
一开始Kafka没有分区Partition的概念,这样各种消息相当于放在一个队列里,比较低效。
然后呢,Kafka引入了分区Partiton的概念,但是没有Broker集群的概念,可靠性不够强。
现在呢,Kafka有了分区的概念,也有了Broker的概念。
发布了96 篇原创文章 · 获赞 172 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/ai_64/article/details/100679115