Vert.x:处理Rabbitmq消费者背压而不丢失新消息

时间:2019-07-02 09:31:31

标签: java rabbitmq rx-java message-queue vert.x

当收到的邮件多于处理能力时。一种解决方案是限制内部队列的大小:

// 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();
  }
});

问题是,当超出内部队列队列容量时,新邮件将被丢弃

如何处理背压而不丢失任何消息?

2 个答案:

答案 0 :(得分:0)

在开始处理消息时调用mqConsumer.pause(),然后在完成处理后调用mqConsumer.resume()。当您的处理不同步时,应该始终执行此操作。

https://vertx.io/docs/vertx-rabbitmq-client/java/#_consume

答案 1 :(得分:0)

我最近使用了len()函数来限制来自兔子的消息使用量,并且它运行正常。

此函数的第一个参数确定预取消息的数量与用户(或整个渠道)一起使用,因此它应像内部队列大小一样工作,但无需提取和丢弃邮件。