Kafka代理无法通过kafka.javaapi.producer.Producer.send()批处理API消费消息

时间:2015-01-09 19:01:58

标签: java multithreading apache-kafka

我编写了一个应用程序来流式传输存储在Cassandra中的事件数据并推送到Kafka代理(版本kafka_2.9.2-0.8.1.1),但是如果Kafka代理已关闭,则读取事件将继续缓存在Cassandra的缓存存储中并在一次调用send()中重试。如果Kafka经纪人长时间停机,这个缓存大小会迅速增加。

我遇到的情况是应用程序尝试使用以下方式向Kafka经纪人发送超过75000条消息:

class kafka.javaapi.producer.Producer<K,V> {
...
    public void send(List<KeyedMessage<K,V>> messages);
...
}

然而,它失败了以下异常:

kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
        at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:90)
        at kafka.producer.Producer.send(Producer.scala:76)
        at kafka.javaapi.producer.Producer.send(Producer.scala:42)
        at com.tfsc.ilabs.chronos.app.gen.event.pipeline.impl.KafkaEventProcessor.sendTuplesToKafka(KafkaEventProcessor.java:64)
        at com.tfsc.ilabs.chronos.app.gen.event.pipeline.processing.loader.impl.GenericTupleProcessingLoader.loadTuples(GenericTupleProcessingLoader.java:22)
        at com.tfsc.ilabs.chronos.processing.transactionmanager.impl.TransactionManager$TransactionManagerLoaderJob.run(TransactionManager.java:159)
        at com.tfsc.ilabs.core.trackingservice.TrackableRunnable.run(TrackableRunnable.java:21)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

其缓存中消息较少的另一台主机能够在没有任何问题的情况下写入Kafka代理,因此没有安装或网络问题。

有人可以解释一下Kafka经纪人在一次调用上述API函数时可以处理的消息数量是否有限制,并为此问题提出一些解决方案。

0 个答案:

没有答案