如何保证kafka正常

Kafka是高吞吐低延迟的高并发、高性能的消息中间件,在大数据领域有极为广泛的运用。配置良好的Kafka集群甚至可以做到每秒几十万、上百万的超高并发写入。 

1.kafka如何实现高并发,高性能写入数据的?

        Kafka在写数据的时候,一方面基于了os层面的page cache(页缓存)来写数据,所以性能很高,本质就是在写内存罢了.

        另外一个就是kafka写数据的时候,非常关键的一点,他是以磁盘顺序写的方式来写的。也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

 2.如何保证kafka写入数据不丢失?

        kafka核心机制是ISR,ISR会维护一个列表,在高可用架构里,将数据分布式存储在partition1,partition2,partition_n中,同时每个partition会维护各自的ISRl列表,列表里至少含有一个partition_leader和一个partition_follower,leader对外提供读写,follower作为leader数据的备份,在leader挂掉无法对外提供服务的时候,ISR会自动将follower升级为leader,对外提供服务;在保证数据不丢失的问题上,采用事务的机制,将对leader的写入和leader对follower的数据同步备份加入一个事务中,如果leader刚写入还没来得及将数据同步给follower就挂掉,从事务的角度来讲,leader的写入也是不成功的,需要生产者不断的重试写入,直到leader和follower整个事务成功才算写入成功,这种机制保证了kafka数据不会丢失.

3.kafka如何保证数据不会被重复消费?

        kafka有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的offset来继续消费。

        幂等性,通俗点说,就一个数据,或者一个请求,给你重复来多次消费,你得确保对应的数据是不会改变的,不能出错。

        生产者:kafka 0.11.0.0版本引入了idempotent producer机制,在这个机制中同一消息可能被producer发送多次,但是在broker端只会写入一次,他为每一条消息编号去重,而且对kafka开销影响不大。如何设置开启呢? 需要设置producer端的新参数 enable.idempotent 为true。

        消费者: offset手动提交,业务逻辑成功处理后,提交offset,将offset写入redis(redis天然去重),每次消费前先在redis中读取下offset,就算kafka重启,对比redis中的offset,就知道最新消费的数据编号了.

        保证不重复消费:落表(主键或者唯一索引的方式,避免重复数据);
        业务逻辑处理: 选择唯一主键存储到Redis或者mongdb中,先查询是否存在,若存在则不处理;若不存在,先插入Redis或Mongdb,再进行业务逻辑处理.

猜你喜欢

转载自blog.csdn.net/qq_40132294/article/details/121401640