在 Kafka 工作机制 一文提及了 Kafka 消息的不可靠性。本文就 Kafka 消息的三种不可靠性(重复、丢失、乱序),分析它们出现的内部原因和解决办法。
Kafka就比较适合高吞吐量并且允许少量数据丢失的场景,如果非要保证“消息只读取一次”,可以使用JMS。 参考: http://blog.csdn.net/u012050154/article/details/78592854
Kafka Producer 消息发送有两种方式(配置参数 producer.type
):
producer.type=sync
(默认值): 后台线程中消息发送是同步方式,对应的类为 kafka.producer.SyncProducer;producer.type=async
: 后台线程中消息发送是异步方式,对应的类为 kafka.producer.AyncProducer;优点是可批量发送消息(消息个数达到 batch.num.messages=200
或时间达到 时发送)、吞吐量佳,缺点是发送不及时可能导致丢失;对于同步方式(producer.type=sync
)?Kafka Producer 消息发送有三种确认方式(配置参数 acks
):
acks=0
: producer 不等待 Leader 确认,只管发出即可;最可能丢失消息,适用于高吞吐可丢失的业务;acks=1
(默认值): producer 等待 Leader 写入本地日志后就确认;之后 Leader 向 Followers 同步时,如果 Leader 宕机会导致消息没同步而丢失,producer 却依旧认为成功;acks=all/-1
: producer 等待 Leader 写入本地日志、而且 Leader 向 Followers 同步完成后才会确认;最可靠。Kafka Consumer 有两个接口:
Kafka 支持 3 种消息传递语义:
consumer.poll();
consumer.commitOffset();
processMsg(messages);
consumer.poll();
processMsg(messages);
consumer.commitOffset();
session.timeout.ms
,导致没有接收心跳而挂掉,自动提交offset失败,下次会重复消费本批消息;enable.auto.commit=false
传统的队列,在并行处理时,由于网络故障或速度差异,尽管服务器传递是有序的,但消费者接收的顺序可能不一致; Kafka 在主题内部有分区,并行处理时,每个分区仅由消费者组中的一个消费者使用,确保了消费者是该分区的唯一读者,并按顺序使用这些数据。 但是它也仅仅是保证Topic的一个分区顺序处理,不能保证跨分区的消息先后处理顺序,除非只提供一个分区。
作者:王克锋
出处:https://kefeng.wang/2017/11/22/kafka-reliability/