鉴于以下情况:
我在当地培养了一个动物园管理员和一个卡夫卡经纪人并创建了"测试" 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
答案 0 :(得分:1)
Kafka Producer库内置了重试机制,但默认情况下它已关闭。将retries
生产者配置更改为大于0(默认值)的值以将其打开。您还应该尝试使用retry.backoff.ms
和request.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应该抛出异常。
我希望这会有所帮助。