Camel RabbitMQ连接器在使用之前会读取数千条消息

Camel RabbitMQ连接器在使用之前会读取数千条消息,rabbitmq,apache-camel,Rabbitmq,Apache Camel,在我的应用程序中,我们使用驼峰路由从RabbitMQ队列读取消息。 配置如下所示: from("rabbitmq:myexchange?routingKey=mykey&queue=q") 制作人可以在几分钟内发送50k条消息,每条消息的处理可能需要1秒或更长时间 我所看到的是,所有的消息都被消耗得非常快,但处理这些消息可能需要很多小时。预计会有很多小时的处理,但这是否意味着50k消息会存储在内存中?如果是这样,我想禁用此行为,因为我不想在进程停止时丢失消息。。。事实上,我们正在丢失大

在我的应用程序中,我们使用驼峰路由从RabbitMQ队列读取消息。 配置如下所示:

from("rabbitmq:myexchange?routingKey=mykey&queue=q")
制作人可以在几分钟内发送50k条消息,每条消息的处理可能需要1秒或更长时间

我所看到的是,所有的消息都被消耗得非常快,但处理这些消息可能需要很多小时。预计会有很多小时的处理,但这是否意味着50k消息会存储在内存中?如果是这样,我想禁用此行为,因为我不想在进程停止时丢失消息。。。事实上,我们正在丢失大部分消息,即使进程保持正常,这更糟糕。看起来连接器的设计不是为了一次处理这么多消息,但我不能说这是因为连接器本身还是因为我们没有正确配置它

我尝试了自动确认选项:

from(“rabbitmq:myexchange?routingKey=mykey&queue=q&autoAck=false”)


这样,当出现问题时会回滚消息,但同时保持50k条消息未确认似乎不是一个好主意…

我想与大家分享几件事

  • AutoAck-是如果要处理消息(在收到消息后),应将AutoAck设置为False,并在处理消息后明确确认消息

  • 设置-您需要微调预取大小,预取大小是RabbitMQ在go中呈现给消费者的最大消息数,即最多您的未确认消息总数将等于预取大小。根据您的系统,如果每条消息都很重要,您可以将预取大小设置为1;如果您有处理消息的多线程模型,则可以将预取大小设置为与每个线程处理一条消息的线程数相匹配,同样


  • 在某种程度上,它在架构上就像一个缓冲区。如果您的进程在处理这些消息时停止,则在进程停止之前未确认的任何消息仍将在队列中,消费者将再次获取该消息进行处理。

    事实上,在autoAck=false和prefetchCount=1的情况下,该消息看起来与我希望的一样工作。我尝试了这些参数中的每一个,但从未同时尝试过。我会尽快在一台真正的服务器上进行测试。工作非常出色!也许这种配置对于吞吐量来说不是最好的,但是我们的处理速度很慢,它不会改变整体性能。