kafka你需要了解的几个问题

一、什么是kafka?kafka的应用场景是?

Apache Kafka是由Apache开发的一种发布订阅消息系统,它是一个分布式的、分区的和可复制的提交日志服务。

优点:

1)吞吐量高,单机吞吐量十万级

2)高时效性(ms级)

3)高可用性,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用;

4)消息可靠性,消息可以做到0丢失;(ack配置)

5)功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用

缺点:

1)批量发送,数据并非真正的实时, 仅支持统一分区内消息有序,无法实现全局消息有序。(有Key值,对Key值进行Hash,然后对分区数量取余,保证了同一个Key值的会被路由到同一个分区)

2)有可能消息重复消费

3)依赖zookeeper进行管理,各机器创建临时节点,并watch这些临时节点,一旦机器和临时节点长连接断开,临时节点会通知其他机器

应用:

1)异步处理 

2)解耦 

3)流量削峰 

4)日志处理 

5)消息通讯

二、kafka

kafka通过zookeeper管理集群配置及服务协同。Producer使用push模式将消息发布到broker,consumer通过监听使用pull模式从broker订阅并消费消息。

1)Broker

Kafka集群包含一个或多个服务器,这种服务器被称为broker,通过zookeeper选出一个controller。(同时创建节点,同名节点只有一个能成功,创建成功就是controller)

2)Producer

负责发布消息到Kafka broker,消息会通过分配策略append到某个partition末尾。

3)Consumer

消息消费者,向Kafka broker读取消息的客户端,consumer从broker拉取(pull)数据并进行处理。每个consumer都保留自己的offset,互相之间不干扰,不存在线程安全问题。

4)Topic

Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic

5)Partition

为了使得Kafka的吞吐率可以线性提高,把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。消息以partition为单位分配到多个server,以partition为单位进行备份(replica)。1个leader和N个followers,leader接受读写请求,followers被动复制leader。leader和followers会在集群中打散,保证partition高可用。

这样如果有部分服务器不可用,副本所在的服务器就会接替上来,保证应用的持续性。Kafka会在Zookeeper上针对每个Topic维护一个称为ISR(in-sync replica 已同步的副本)的集合,该集合中是一些分区的副本。如果某个分区所在的服务器除了问题,kafka会从该分区的其他的副本Follower中选择一个作为新的Leader,之后所有的读写就会转移到这个新的Leader上。

6)Consumer Group

每个Consumer属于一个特定的Consumer Group,若不指定group name则属于默认的group

三、如何保证消息刚好消费一次

kafka有两次消息传递,一次生产者发送消息给kafka,一次消费者去kafka消费消息。两次都是精确一次,最终结果才是精确一次。

1)最多一次(at most once):

消息可能丢失也可能被处理,但最多只会被处理一次。

可能丢失 不会重复

2)至少一次(at least once):

消息不会丢失,但可能被处理多次。

可能重复 不会丢失

3)精确传递一次(exactly once):

消息被处理且只会被处理一次。

不丢失 不重复 就一次

1)生产者:

ack

0: producer完全不管broker的处理结果,可能丢数据但吞吐量最高。(at most once)

​-1或者all:leader broker会等消息写入,并且ISR都写入后 才会响应,这种只要ISR有副本存活就肯定不会丢失,但吞吐量最低。(at least once)

​ 1: acks的默认值,leader broker自己写入后就响应,不会等待ISR其他的副本写入,只要leader broker存活就不会丢失,即保证了不丢失,也保证了吞吐量。(at least once)

enable.idempotent=true(kafka0.11.0.0版本引入

同一消息可能被producer发送多次,但是在broker端只会写入一次,他为每一条消息编号去重,而且对kafka开销影响不大。幂等producer只能保证单分区上无重复消息;事务可以保证多分区写入消息的完整性。

2)消费者

enable.auto.commit默认为true,consumer在消费之前提交位移(at most once)。

auto.commit.interval.ms在enable.auto.commit=true的情况下,自动提交的间隔,默认值5000ms。

max.poll.records 单次poll,消费者拉取的最大数据条数,默认值500

max.poll.interval.ms  默认值5分钟,表示若5分钟之内消费者没有消费完上一次poll的消息,那么consumer会主动发起离开g
roup的请求,造成rebalance。

当上一次poll方法拉取的消息消费完时会进行下一次poll,在经过auto.commit.interval.ms间隔后,下一次调用poll时会提交所有已消费消息的offset。

可以配置成false,然后通过调用commitSync、commitAsync方法的方式完成offset的提交,但是可能存在中断的问题,最好还是通过流水号等机制保证幂等

四、ISR是什么?

分区中的所有副本统称为AR,所有与leader副本保持一定程度同步的副本(包括Leader)组成ISR(In-Sync Replicas),ISR集合是AR集合中的一个子集。消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本而言会有一定程度的滞后。

当检测到ISR中有是失效的副本的时候,就会缩减ISR集合。如果某个分区的ISR集合发生变更, 则会将变更后的数据记录到ZooKerper对应/brokers/topics//partition//state节点中

五、消费者负载均衡策略

一个消费者组中的一个分片对应一个消费者,他能保证每个消费者成员都能访问。(如果消费者太多会有空闲的)

发布了43 篇原创文章 · 获赞 0 · 访问量 3894

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105298355
今日推荐