大数据技术分享

Kafka ——如何保证消息不会丢失

2019-11-25  本文已影响0人  code_solve

前言

Kafka 提供了数据高可靠的特性,
但是如果使用不当,
你可能无法享受到这一特性,
今天我们就来看看如何正确的使用Kafka 保证数据的不会丢失吧!

生产者的正确的消息发送方式

Kafka为生产者生产消息提供了一个 send(msg) 方法,
另有一个重载的方法send(msg, callback),

生产者的配置

当我们通过 send(msg, callback) 是不是就意味着消息一定不丢失了呢?
答案明显是:不是的
我们接着上面,
send(msg, callback)里面 callback返回的成功,
到底是不是真的确保消息万无一失了?
其实这个返回的成功也是可以在生产者配置的:

 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
//*******重点*****************
 props.put("acks", "all");
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

 Producer<String, String> producer = new KafkaProducer<>(props);
 for (int i = 0; i < 100; i++)
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));
 producer.close();

这段代码是生产者发送消息的一个例子,
其中没使用callback主要是这里callback不是重点,
我们的重点是props.put("acks", "all");
这个acks配置属性就是我们callback成功的具体含义:

Broker 端的配置

其实到这里,生产者端基本已经做好了数据不丢失的大部分准备,
但是有些东西是要配合 Broker 端一起,
才能达到预期的不丢失数据的,
比如我们上面说到的

重试 retries

上面已经基本完成了不丢数据的方方面面了,
但是有些东西不是我们能控制的,
比如 网络抖动 等不可抗拒的因素,
这时候重试次数就很关键了,
配置合适的retries重试次数,
和 合适的retry.backoff.ms重试间隔时间,
将为我们的数据发送提供更高的稳定性,
当然如果实在发送不成功,怎么办呢?
一般我们也可以把发送不成功的数据保存在一个日志文件,
如果数据很重要,那就发送警告信息,
人工干预一下。

上一篇下一篇

猜你喜欢

热点阅读