我编写了一个应用程序来流式传输存储在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函数时可以处理的消息数量是否有限制,并为此问题提出一些解决方案。