经纪人倒闭时,卡夫卡制片人正在失去信息

时间:2018-04-05 21:16:23

标签: java apache-kafka kafka-producer-api

鉴于以下情况:

我在当地培养了一个动物园管理员和一个卡夫卡经纪人并创建了"测试" kafka快速入门中描述的主题:https://kafka.apache.org/quickstart

然后,我运行一个简单的java程序,它向" test"生成一条消息。主题每一秒。一段时间后,我把我当地的kafka经纪人带走,看到制作人继续制作消息,它不会抛出任何异常。最后,我再次启动kafka代理,生产者能够重新连接到代理并继续生成消息,但是,在kafka代理停机期间生成的所有消息都将丢失。当检测到健康的kafka经纪人时,制片人不会重播它们。

我该怎样防止这种情况?我希望kafka生产商在检测到kafka经纪人重新联机时重播这些消息。这是我的制作人配置:

ja = a.columns.get_loc('a')
jb = b.columns.get_loc('d')

pd.DataFrame([
    np.append(ra, rb)
    for ra in a.values
    for rb in b.values
    if ra[ja] - rb[jb] >= -3
], columns=a.columns.append(b.columns))

   a  b  c  d  e  f
0  1  2  3  4  7  4
1  4  5  6  4  7  4
2  4  5  6  6  5  1

2 个答案:

答案 0 :(得分:1)

Kafka Producer库内置了重试机制,但默认情况下它已关闭。将retries生产者配置更改为大于0(默认值)的值以将其打开。您还应该尝试使用retry.backoff.msrequest.timetout.ms来自定义Producer重试次数。

启用重试的示例Kafka Producer配置:

retries=2147483647         //Integer.MAX_VALUE 
retry.backoff.ms=1000
request.timeout.ms=305000  //5 minutes
max.block.ms=2147483647    //Integer.MAX_VALUE 

您可以在Apache Kafka documentation中找到有关这些属性的更多信息。

答案 1 :(得分:0)

由于您只经营一家经纪商,我担心您的经纪人停业时您无法存储消息。

然而,当您将经纪人关闭时,您不会收到任何异常/警告/错误,这很奇怪。

我希望"无法更新元数据"或者"到期消息"错误,因为当生产者将消息发送到针对bootstrap.servers属性提到的代理时,它首先检查zookeeper以查找活动控制器(或领导者)和分区。因此,在您的情况下,因为您在独立模式下运行kafka,并且当代理关闭时,生产者不应该收到领导者信息并且错误输出。

请查看以下属性设置为:

request.timeout.ms
max.block.ms

用这些值来玩(减少,可能)?并检查结果?

您可能想要尝试的另一个选项是以同步方式向Kafka发送消息(阻止send()方法,直到收到消息)并且这是一个可能有用的代码片段(取自{{ 3}}):

如果你想模拟一个简单的阻塞调用,你可以立即调用get()方法:

byte[] key = "key".getBytes();
byte[] value = "value".getBytes();
ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("my-topic", key, value)
producer.send(record).get();

在这种情况下,如果由于任何原因未成功发送消息,kafka应该抛出异常。

我希望这会有所帮助。

相关问题