当收到的邮件多于处理能力时。一种解决方案是限制内部队列的大小:
// Limit to max 300 messages
QueueOptions options = new QueueOptions()
.setMaxInternalQueueSize(300);
RabbitMQClient client = RabbitMQClient.create(vertx, new RabbitMQOptions());
client.basicConsumer("my.queue", options, res -> {
if (res.succeeded()) {
System.out.println("RabbitMQ consumer created !");
RabbitMQConsumer mqConsumer = res.result();
mqConsumer.handler((RabbitMQMessage message) -> {
System.out.println("Got message: " + message.body().toString());
});
} else {
res.cause().printStackTrace();
}
});
问题是,当超出内部队列队列容量时,新邮件将被丢弃。
如何处理背压而不丢失任何消息?
答案 0 :(得分:0)
在开始处理消息时调用mqConsumer.pause()
,然后在完成处理后调用mqConsumer.resume()
。当您的处理不同步时,应该始终执行此操作。
答案 1 :(得分:0)
我最近使用了len()
函数来限制来自兔子的消息使用量,并且它运行正常。
此函数的第一个参数确定预取消息的数量与用户(或整个渠道)一起使用,因此它应像内部队列大小一样工作,但无需提取和丢弃邮件。