【发布时间】:2016-09-20 20:03:34
【问题描述】:
抱歉,我需要先解释一下才能解决这个问题。
我正在使用 Kafka Client 0.9.0.0 向 Kafka 集群发送消息。该系统是一种管道,它使用来自 JMS 的消息并将其发送到 Kafka。为了保证消息的可靠性,JMS 的确认模式设置为 CLIENT_ACKNOWLEDGE,这样当消息被消费和处理成功时,应用程序确认消息的接收。
一旦消息被消费,消息就会被发送到 Kafka,这就是问题所在。
异步:
我可以使用 Kafka producer async send with with callback,如果向 Kafka 发送消息出错,通知 JMS 消费者不确认消息消费就来不及了。为了克服这个问题,我想出的唯一方法是在出现异常时将消息保留在 Callback 中,然后尝试稍后发送消息。但我认为这将是太多的开销。
有没有其他方法可以使用异步调用来处理这种情况?
同步:
使用同步调用,在Producer.send()返回的future上调用get(),如果发送消息到Kafka有问题,会抛出异常,并可以反馈给JMS消费者,从而成功'不确认消息并稍后重试。
显然它会对性能产生影响,因为这将是一个阻塞调用,而且不好的部分是不会有消息批处理,因为 Kafka 会确认每条消息。
我倾向于同步调用,因为我不想要额外的持久性。
有什么方法或配置,我可以使用同步调用并最大限度地减少同步调用的影响?我所做的一种配置是拥有一个 JMS 消费者池。
【问题讨论】:
标签: apache-kafka kafka-producer-api