可靠的消息传递
Reliable Message Delivery
抱歉,我需要先解释一下才能进入问题。
我正在使用 Kafka 客户端 0.9.0.0 向 Kafka 集群发送消息。该系统有点像管道,它使用来自 JMS 的消息并将其发送到 Kafka。为了保证消息的可靠性,JMS确认模式设置为CLIENT_ACKNOWLEDGE,这样当消息被消费和处理成功时,应用程序确认消息接收。
消息被消费后,消息被发送到 Kafka,这就是问题所在。
异步:
我可以使用Kafka producer async send with with callback,如果向Kafka发送消息出错,通知JMS消费者不要确认消息消费就来不及了。为了克服这个问题,我想到的唯一一件事就是在出现异常时将消息保留在回调中,并稍后尝试发送消息。但我认为这将是太多的开销。
有没有其他方法可以使用异步调用来处理这种情况?
同步:
使用同步调用,在Producer.send()返回的future上调用get(),如果向Kafka发送消息时出现任何问题,将抛出异常并报告给JMS消费者这样它就不会确认消息并在稍后重试。
显然这会对性能产生影响,因为这将是一个阻塞调用,而且不好的部分是不会对消息进行批处理,因为 Kafka 会确认每条消息。
我倾向于同步调用,因为我不想要额外的持久化。
有什么方法或配置可以让我使用同步调用并最大程度地减少同步调用的影响吗?我所做的一个配置是拥有一个 JMS 使用者池。
异步方式:
没有别的办法,只能坚持。您需要权衡性能。
您收到了来自 JMS 的消息。确认您阅读了它。当试图在 kafka 中推送一个主题时,由于某种原因它失败了。你需要做两件事才能可靠。
- 如果失败,有一个重新发送机制来推送到kafka。您可以采用指数退避重试机制来解决间歇性问题(例如,网络中断)
- 在 kafka 或 JMS 中创建一个错误主题,如果 kafka 推送失败,您将向其发送消息。再次将错误主题作为管道的输入。您将需要限制错误主题的消耗,因为如果由于某种原因推送反复失败,它可能会使您的应用程序过载。
这将使它更加可靠。
同步方式:
我不确定在这种情况下如何提高性能。如果性能在您的应用程序中不是问题,我建议您采用这种方式,因为这是最快和最简单的方法。
不知道你说的坚持回调是什么意思。如果您的意思是将消息存储在内存中,那不是一个好主意,因为如果应用程序因某种原因关闭或停止,您将丢失消息。
抱歉,我需要先解释一下才能进入问题。
我正在使用 Kafka 客户端 0.9.0.0 向 Kafka 集群发送消息。该系统有点像管道,它使用来自 JMS 的消息并将其发送到 Kafka。为了保证消息的可靠性,JMS确认模式设置为CLIENT_ACKNOWLEDGE,这样当消息被消费和处理成功时,应用程序确认消息接收。
消息被消费后,消息被发送到 Kafka,这就是问题所在。
异步:
我可以使用Kafka producer async send with with callback,如果向Kafka发送消息出错,通知JMS消费者不要确认消息消费就来不及了。为了克服这个问题,我想到的唯一一件事就是在出现异常时将消息保留在回调中,并稍后尝试发送消息。但我认为这将是太多的开销。
有没有其他方法可以使用异步调用来处理这种情况?
同步:
使用同步调用,在Producer.send()返回的future上调用get(),如果向Kafka发送消息时出现任何问题,将抛出异常并报告给JMS消费者这样它就不会确认消息并在稍后重试。
显然这会对性能产生影响,因为这将是一个阻塞调用,而且不好的部分是不会对消息进行批处理,因为 Kafka 会确认每条消息。
我倾向于同步调用,因为我不想要额外的持久化。
有什么方法或配置可以让我使用同步调用并最大程度地减少同步调用的影响吗?我所做的一个配置是拥有一个 JMS 使用者池。
异步方式:
没有别的办法,只能坚持。您需要权衡性能。
您收到了来自 JMS 的消息。确认您阅读了它。当试图在 kafka 中推送一个主题时,由于某种原因它失败了。你需要做两件事才能可靠。
- 如果失败,有一个重新发送机制来推送到kafka。您可以采用指数退避重试机制来解决间歇性问题(例如,网络中断)
- 在 kafka 或 JMS 中创建一个错误主题,如果 kafka 推送失败,您将向其发送消息。再次将错误主题作为管道的输入。您将需要限制错误主题的消耗,因为如果由于某种原因推送反复失败,它可能会使您的应用程序过载。
这将使它更加可靠。
同步方式:
我不确定在这种情况下如何提高性能。如果性能在您的应用程序中不是问题,我建议您采用这种方式,因为这是最快和最简单的方法。
不知道你说的坚持回调是什么意思。如果您的意思是将消息存储在内存中,那不是一个好主意,因为如果应用程序因某种原因关闭或停止,您将丢失消息。