21.请说明什么是传统的消息传递方法?
传统的消息传递方法包括两种:
队列:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人
发布-订阅:在这个模型中,消息被广播给所有的用户
22.请说明Kafka相对于传统的消息传递方法有什么优势?
高性能:单一的Kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作,Kafka性能远超过传统的ActiveMQ、RabbitMQ等,而且Kafka支持Batch操作
可扩展:Kafka集群可以透明的扩展,增加新的服务器进集群
容错性: Kafka每个Partition数据会复制到几台服务器,当某个Broker失效时,Zookeeper将通知生产者和消费者从而使用其他的Broker
23.在Kafka中broker的意义是什么?
在Kafka集群中,broker指Kafka服务器
术语解析
名称 | 说明 |
---|---|
Topic | 主题,可以理解为一个队列 |
Partition | 分区,为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序 |
Offset | 偏移量,kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafkaOffset |
Broker | 一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic |
Producer | 消息生产者,向kafka broker发消息的客户端 |
Consumer | 消息消费者,向kafka broker取消息的客户端 |
Consumer Group | 消费者组,这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic |
24.如何保证 Kafka 中的消息是有序的?
单线程顺序消费
生产者在发送消息时,将消息对应的id进行取模处理,相同的id发送到相同的分区。消息在分区内有序,一个分区对应了一个消费者,保证了消息消费的顺序性。
多线程顺序消费
单线程顺序消费已经解决了顺序消费的问题,但是它的扩展能力很差。为了提升消费者的处理速度,但又要保证顺序性,我们只能横向扩展分区数,增加消费者。
我们可以模仿一下kafka的分区思想操作。将接收到的kafka数据进行hash取模(注意注意,你kafka分区接受消息已经是取模的了,这里一定要对id做一次hash再取模)发送到不同的队列,然后我们开启多个线程去消费对应队列里面的数据。
25.kafka数据丢失问题,及如何保证?
1)数据丢失:
acks=1的时候(只保证写入leader成功),如果刚好leader挂了。数据会丢失
acks=0的时候,使用异步模式的时候,该模式下kafka无法保证消息,有可能会丢
2)brocker如何保证不丢失:
acks=-1 : 所有副本都写入成功并确认
retries = 一个合理值
min.insync.replicas=2 消息至少要被写入到这么多副本才算成功
unclean.leader.election.enable=false 关闭unclean leader选举,即不允许非ISR中的副本被选举为leader,以避免数据丢失
3)Consumer如何保证不丢失:
如果在消息处理完成前就提交了offset,那么就有可能造成数据的丢失
enabel.auto.commit=false关闭自动提交offset
处理完数据之后手动提交
26.kafka的消费者方式?
consumer采用pull(拉)模式从broker中读取数据
push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息
对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义
pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在我们的拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞
27.Kafka消费过的消息如何再消费
kafka 消费消息的 offset 是定义在 zookeeper 中的,如果想重复消费 afka 的消息可以在 redis 中自己记录 offset 的 checkpoint 点 (n 个) ,当想重复消费消息时通过读取 redis 中的 checkpoint 点进行 zookeeper 的 offset 重设,这样就可以达到重复消费消息的目的了
28.Kafka重启是否会导致数据丢失
1.kafka 是将数据写到磁盘的,一般数据不会丢失
2.但是在重启 kafka 过程中,如果有消费者消费消息,那么 kafka 如果来不2及提交 offset,可能会造成数据的不准确 (丢失或者重复消费)
29.Kafka 核心组件有哪些, 分别有什么作用呢?
Kafka 核心组件的基础概念:
1)**Producer:**即消息生产者,向 Kafka Broker 发消息的客户端。
2)**Consumer:**即消息消费者,从 Kafka Broker 读消息的客户端。
3)**Consumer Group:**即消费者组,由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,以提高消费能力。一个分区只能由组内一个消费者消费,不同消费者组之间互不影响。
4)Broker:一台 Kafka 服务节点就是一个 Broker。一个集群是由1个或者多个 Broker 组成的,且一个 Broker 可以容纳多个 Topic。
5)**Topic:**一个逻辑上的概念,Topic 将消息分类,生产者和消费者面向的都是同一个 Topic, 同一个 Topic 下的 Partition 的消息内容是不相同的。
6)**Partition:**为了实现 Topic 扩展性,提高并发能力,一个非常大的 Topic 可以分布到多个 Broker 上,一个 Topic 可以分为多个 Partition 进行存储,且每个 Partition 是消息内容是有序的。
7)Replica:即副本,为实现数据备份的功能,保证集群中的某个节点发生故障时,该节点上的 Partition 数据不丢失,且 Kafka 仍然能够继续工作,为此 Kafka 提供了副本机制,一个 Topic 的每个 Partition 都有若干个副本,一个 Leader 副本和若干个 Follower 副本。
8)**Leader:**即每个分区多个副本的主副本,生产者发送数据的对象,以及消费者消费数据的对象,都是 Leader。
9)**Follower:**即每个分区多个副本的从副本,会实时从 Leader 副本中同步数据,并保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 还会被选举并成为新的 Leader , 且不能跟 Leader 在同一个 Broker 上, 防止崩溃数据可恢复。
10)**Offset:**消费者消费的位置信息,监控数据消费到什么位置,当消费者挂掉再重新恢复的时候,可以从消费位置继续消费。
30.Kafka 消费模型有哪些?
一般情况下消息消费总共有两种模式:「推模型」和 「拉模型」。在 Kafka 中的消费模型是属于「拉模型」,此模式的消息消费方式实现有两种:「点对点方式」和 「发布订阅方式」。
点对点方式
**点对点方式: **假如所有消费者都同属于一个消费组的话,此时所有的消息都会被分配给每一个消费者,但是消息只会被其中一个消费者进行消费。
发布订阅方式
**发布订阅: **假如所有消费者属于不同的消费组,此时所有的消息都会被分配给每一个消费者,每个消费者都会收到该消息。
参考资料
1.华仔聊技术
2.五分钟学大数据
3.胡夕 《Kafka 核心源码解读》