我有一个独特的问题,每天发生50-100次,每天的消息量约为2百万。我使用的是Kafka生产者API 0.8.2.1,我有12个经纪人(v 0.8.2.2) )在复制4的prod中运行。我有一个包含60个分区的主题,我正在为所有消息计算分区并在ProducerRecord本身中提供值。现在,问题 -
应用程序创建' ProducerRecord'使用 -
new ProducerRecord<String, String>(topic, 30, null, message1);
提供主题,值 message1 和分区 30 。然后应用程序调用send方法并返回future -
// null is for callback
Future<RecordMetadata> future = producer.send(producerRecord. null);
现在,app通过调用get on Future打印偏移量和分区值,然后从RecordMetadata获取值 - 这就是我得到的 -
Kafka回复:分区30,偏移3416092
现在,应用程序会生成下一条消息 - message2 到同一分区 -
new ProducerRecord<String, String>(topic, 30, null, message2);
和kafka回复 -
Kafka回复:分区30,偏移3416092
我再次收到相同的偏移量,如果我使用简单的消费者从分区30的偏移量中提取消息,它最终会成为 message2 ,这实际上意味着我丢失 message1 。
基于KafkaProducer文档KafkaProducer,我在10个线程中使用单个生产者实例(静态实例共享)。
生产者是线程安全的,通常应该在所有线程之间共享以获得最佳性能。
我正在使用producer的所有默认属性(max.request.size:10000000除外),消息(String payload)大小可以是几kbs到500 kbs。我使用ack值为1。
我在这里做错了什么?有什么我可以查看或任何生产者属性或服务器属性我可以调整,以确保我不会丢失任何消息。我很快就需要一些帮助,因为我在生产中丢失了一些关键信息,因为除非下游流程报告,否则它甚至很难找到丢失的消息。
修改
服务器和客户端现在更新为kafka版本0.8.2.2。此外,10个应用程序线程现在每个都使用自己的kafka生成器实例。我们看到了更好的性能,但仍有消息丢失。
制片人属性:
value.serializer: org.apache.kafka.common.serialization.StringSerializer
key.serializer: org.apache.kafka.common.serialization.StringSerializer
bootstrap.servers: {SERVER VIP ENDPOINT}
acks: 1
batch.size: 204800
linger.ms: 10
send.buffer.bytes: 1048576
max.request.size: 10000000