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

时间:2019-10-17 19:25:43

标签: rabbitmq apache-camel

在我的应用中,我们使用骆驼路由从RabbitMQ队列中读取消息。 配置看起来像这样:

from("rabbitmq:myexchange?routingKey=mykey&queue=q")

生产者可以在几分钟内发送5万条消息,每条消息可能需要1秒钟或更长时间来处理。

我看到的是所有消息的消耗都非常快,但是处理这些消息可能要花费很多时间。预计需要数小时的处理时间,但这是否意味着50k消息存储在内存中?如果是这样,我想禁用此行为,因为我不想在进程关闭时丢失消息...实际上,即使进程保持运行状态,我们也会丢失大多数消息,这更糟。看来该连接器并非旨在一次处理这么多消息,但我不能说是因为连接器本身还是因为我们没有正确配置它。

我尝试了autoAck选项:

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

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

1 个答案:

答案 0 :(得分:2)

我想分享几件事。

  1. AutoAck-是的,如果要处理消息(在收到消息后),则应将AutoAck设置为False,并在处理完消息后明确确认消息。

  2. 设置Consumer PreFetch-您需要微调PreFetch大小,该预取大小是RabbitMQ在运行过程中将向消费者显示的最大消息数,即最多不确认的消息数将等于“预取”大小。取决于您的系统,如果每条消息都很重要,则可以将预取大小设置为1;如果您具有处理消息的多线程模型,则可以将预取大小设置为与每个线程处理一条消息的线程数相匹配,同样。

在某种程度上,它在结构上像缓冲区一样。如果您的进程在处理这些消息时发生故障,则任何在该进程发生故障之前未得到确认的消息仍将保留在队列中,并且消费者将再次获得该消息进行处理。

enter image description here