Kafka消息安全传输

Kafka消息安全传输三个个方面:

    1.消息生产:producer-->kafka 传输层次

    2.消息存储:kafka本身配置层次

    3.消息消费:kafka-->consumer 消费层次

消息生产:

    问题:

        1.异步模式:request.required.acks=0 生产者只发送消息(类似于UDP协议),数据丢失可能性极大

          2.request.required.acks=1只保证写入leader成功,如果leader突然挂掉,数据会丢失

          3.request.required.acks=-1 Leader和Follower都接收成功时确认,数据丢失可能性小,性能会变低

    消息发送:

        KafkaProducer.send(ProducerRecord)方法仅仅是把这条消息放入一个缓存中(即RecordAccumulator,本质上使用了队列来缓存记录),同时后台的IO线程会不断扫描该缓存区,将满足条件的消息封装到某个batch中然后发送出去。显然,这个过程中就有一个数据丢失的窗口:若IO线程发送之前client端挂掉了,累积在accumulator中的数据的确有可能会丢失。   

    乱序问题:

        如:

        producer.send(record1);
        producer.send(record2);

    如果此时由于某些原因(比如瞬时的网络抖动)导致record1没有成功发送,同时Kafka又配置了重试机制和max.in.flight.requests.per.connection大于1(默认值是5,本来就是大于1的),那么重试record1成功后,record1在分区中就在record2之后,从而造成消息的乱序。很多某些要求强顺序保证的场景是不允许出现这种情况的。

        方案:1.producer.send(record).get();虽可以解决问题,但性能不佳,不建议使用

        2.block.on.buffer.full = true使得producer将一直等待缓冲区直至其变为可用。否则如果producer生产速度过快耗尽了缓冲区,producer将抛出异常

               acks=all  很好理解,所有follower都响应了才认为消息提交成功,即"committed"

                retries = MAX 无限重试,直到你意识到出现了问题

                max.in.flight.requests.per.connection = 1

                使用KafkaProducer.send(record, callback)而不是send(record)方法   自定义回调逻辑处理消息发送失败

callback逻辑中最好显式关闭producer:close(0) 注意:设置此参数是为了避免消息乱序

                unclean.leader.election.enable=false   关闭unclean leader选举,即不允许非ISR中的副本被选举为leader,以避免数据丢失

                           



消息消费:

    重复消费原因

        底层根本原因:已经消费了数据,但是offset没提交。

        原因1:强行kill线程,导致消费后的数据,offset没有提交。

        原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费。

        原因3(重复消费最常见的原因):消费后的数据,当offset还没有提交时,partition就断开连接。比如,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-blance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。

    丢失数据原因

        猜测:设置offset为自动定时提交,当offset被自动定时提交时,数据还在内存中未处理,此时刚好把线程kill掉,那么offset已经提交,但是数据未处理,导致这部分内存中的数据丢失。

        enable.auto.commit=false  关闭自动提交位移,在消息被完整处理之后再手动提交位移






kafka高级进阶:

    http://www.jasongj.com/2015/01/02/Kafka%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/




你可能感兴趣的:(kafka)