初识Kafka与生产者

阅读以下内容你将了解到:
1.什么是Kafka
2.为什么要使用 Kafka,为什么要使用消息队列
3.Kafka中的基本角色讲解:
4.Kafka与ZooKeeper的关系
5.Kafka中的ISR、AR、OSR、LEO、HW代表什么? Follower如何与leader同步数据?
6.生产者的发送方式、序列化器、分区器、拦截器简单介绍(包括顺序消费的实现、broker的发现):

1 什么是Kafka

Kafka是一个消息队列,具有多分区、多副本且基于ZooKeeper的特点,天然的分布式消息系统,还可以用作存储系统和流式存储平台。
可以保证消息的顺序性、回溯消费

2 为什么要使用 Kafka,为什么要使用消息队列

消息队列最大的作用:削峰、异步、解耦
削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,Kafka在中间可以起到一个缓冲的作用,把消息暂存在Kafka中,下游服务就可以按照自己的节奏进行慢慢处理。

解耦:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要把消息丢到消息队列中即可让消息队列保证消费。

异步通信:很多时候,用户不想也不需要立即处理消息(因为立即处理可能会导致流量飙升,也可以做到比如一个小时候再执行的定时任务)。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
这三点是所有消息队列都能做到的点。而kafka还实现了自己的特点功能。

Kafka主要是通过Conumer使用Pull(拉)的方式从服务端拉取信息,Kafka可以分为生产者、消费者、主题和分区、日志存储、服务端、客户端和高级应用等几个模块。会在下面逐渐讲解。

3.Kafka中的基本角色讲解:

Kafka入门

4.Kafka与ZooKeeper的关系

在早期版本中,Kafka需要利用zookeeper存offset 后来存到自己内部的Topic:_consumer_offset里去了
在早期版本中,消费者再均衡的操作也由ZooKeeper执行,当触发再均衡时,整个消费者组下的所有消费者都会进行再均衡操作。这可能会导致两个问题:
(再均衡是指分区所属权从一个消费者转移到另一个的过程。)

羊群效应:一个被监听的节点变化导致大量的Watcher通知被发送到客户端,导致其他操作延迟甚至死锁。
脑裂问题:由于每个消费者都与ZooKeeper进行通信判断消费者或broker变化的情况,由于ZooKeeper的特性可能导致在同一时间各个消费者获取的状态不一样。

新版消费者客户端对此进行了重新设计,将全部消费者分成多个子集,每个子集在服务端对应一个GroupCoordinator对其进行管理,从而避免了ZooKeeper导致的问题。这个GroupCoordinator当然也是注册在ZooKeeper下的。
其他的Consumer、Producer、Broker、Topic的注册、负载均衡、Mater选举、配置维护等还是要Zookeeper

5.Kafka中的ISR、AR、OSR、LEO、HW代表什么? Follower如何与leader同步数据?

AR: Assigned Replicas 所有副本
ISR: In-Sync Replicas 副本同步队列
OSR: Outof-Sync Replicas :与leader副本同步值后过多的副本(此处副本对用户是不可见的。)
LEO: Log End Offset,当前日志中下一条待写入消息的offset
HW: High Watermark ,ISR副本中最小的LEO

ISR是由leader维护,follower从leader同步数据有一些延迟(这延迟是可以接受的,最新版本只由滞后的时间作为标准),如果超出这个滞后时间,就会把follower加入到OSR。
因为follower的滞后性,所以为了保证数据的安全(考虑到leader宕机的情况),用户只能拉取到ISR中最小的LEO,称为HW(High Watermark 即高水位)。
当后来OSR中的副本同步进度不小于 HW时,才有资格加入ISR。(注意只是有资格,满足以下两个条件之一才可以将ISR集合的变化(这个条件对于从ISR移除也同样适用)写到ZooKeeper的目标节点

1.上一次ISR集合发生变化举例现在已经超过5s
2.上一次写入ZooKeeper的时间距离现在已经超过60s

这是为了防止频繁的变化而影响到Kafka控制器、ZooKeeper甚至其他broker的性能)

举个例子:
有一个ISR中的队列,他的leader的LEO为9,有两个副本存在,一个副本的LEO为8,另一个副本的LEO为7,那么消费者只能读取到7以前的消息。这个7就是HW。

注意:在生产者中存在一个参数acks(String类型)
acks为1:只要分区leader副本成功写入消息(写入到log中),就会接收到来组服务端的成功响应。如果被其他follower拉取前leader崩溃,还是会导致消息丢失,这是可靠性和吞吐量折中的方案。
acls为0:生产者发送之后不用等待服务端的响应
acks为-1或者all:需要所有ISR副本(注意是ISR而不是AR)都成功写入消息后才响应。

6.生产者的发送方式、序列化器、分区器、拦截器简单介绍(包括顺序消费的实现、broker的发现):

拦截器:可以给每条消息加一个前缀、或者按照某个规则过滤不符合要求的消息等。
序列化器:生产者需要使用序列化器把对象转换成字节数组才能通过网络发送给Kafka。有自带的String、Double、Byte、Integer等序列化器,如果无法满足需求也可以选择Json、ProtoBuf等通用的来实现。
分区器:如果消息中指定了partition就不需要分区器了,如果没有,那么会根据key来计算partition的值。

生产者的批量发送:
在生产者中有一块可复用的内存区域来存储消息,可以设置等待一段时间或者消息累计到一定大小后批量发送,减少了网络传输的资源消耗。

生产者broker的发现:
生产者只需要配置一部分broker节点的地址,客户端会通过这些broker去发现其他的节点地址。

顺序消费的实现:
生产者可以通过配置相同的key,来使得消息能够顺序消费。(因为对于同一个partition中是顺序加入的,消费也是顺序消费。)

leader与follower的同步策略:
生产者可以配置参数来实现leader与follower的同步策略(请看第3点最后部分acks参数),重试策略等。

你可能感兴趣的:(初识Kafka与生产者)