【问题标题】:Reliable Message Delivery可靠的消息传递
【发布时间】: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


    【解决方案1】:

    异步方式:

    除了坚持,别无他法。您需要权衡性能。

    您收到了来自 JMS 的消息。承认你读过它。当试图在 kafka 中推送一个主题时,由于某种原因它失败了。您需要做两件事才能使其可靠。

    1. 如果失败,有一个重新传递机制来推送到 kafka。您可以采用指数回退重试机制来解决间歇性问题(例如网络中断)
    2. 在 kafka 或 JMS 中创建一个错误主题,如果 kafka 推送失败,您会将消息发送到该主题。再次将错误主题作为管道的输入。您需要限制错误主题的消耗,因为如果由于某种原因,推送反复失败,它可能会使您的应用程序过载。

    这将使它更加可靠。

    同步方式:

    我不确定在这种情况下如何提高性能。如果性能在您的应用程序中不是问题,我建议您采用这种方式,因为这是最快和最简单的方法。

    我不确定你坚持回调是什么意思。如果您的意思是将消息存储在内存中,这是一个坏主意,因为如果应用程序因某种原因关闭或停止,您将丢失消息。

    【讨论】:

    • 通过持久化回调,我的意思是将消息存储到一些持久性存储中,例如数据库或您所说的其他 kafka 主题。
    • 对于异步方式,需要注意的是消息的顺序将不再得到保证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多