Pre-Rocer - Amazon MQ
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Pre-Rocer

您可以使用 RabbitMQ 预取值来优化消费者使用消息的方式。RabbitMQ 通过将预取计数应用于消费者而不是通道,实现 AMQP 0-9-1 提供的通道预取机制。预取值用于指定在任何给定时间向使用者发送的消息数量。默认情况下,RabbitMQ 会为客户端应用程序设置无限制的缓冲区大小。

在为您的 RabbitMQ 使用者设置预取计数时,需要考虑多种因素。首先,考虑消费者的环境和配置。由于消费者需要在处理消息时将所有消息保存在内存中,因此较高的预取值可能会对消费者的性能产生负面影响,在某些情况下,可能会导致消费者一起崩溃。类似地,RabbitMQ 代理本身会将它发送的所有消息缓存在内存中,直到它收到消费者确认。如果没有为使用者配置自动确认,并且使用者需要相对较长的时间来处理消息,则较高的预取值可能会导致 RabbitMQ 服务器内存不足。

考虑到上述考虑因素,我们建议始终设置预取值,以防止由于大量未处理或未确认的消息而导致 RabbitMQ 代理或其使用者内存不足的情况。如果您需要优化经纪商以处理大量报文,您可以使用一系列预取计数来测试您的经纪商和消费者,以确定与消费者处理邮件所需的时间相比,网络开销在哪个点上变得很小。

注意
  • 如果您的客户端应用程序已配置为自动确认消息传递给使用者,则设置预取值将不起作用。

  • 所有预取消息都会从队列中移除。

下面的示例去蒙特将预取值设置为10,用于使用 RabbitMQ Java 客户端库的单个使用者。

ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.basicQos(10, false); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("my_queue", false, consumer);
注意

在 RabbitMQ Java 客户端库中,global标志设置为false,所以上面的例子可以简单地写成channel.basicQos(10)