使用消息ttl实现调度消息RabbitMQ时消息被阻塞

使用消息ttl实现调度消息RabbitMQ时消息被阻塞,rabbitmq,schedule,Rabbitmq,Schedule,我需要调度延迟消息,因此我声明了一个延迟队列delay_STAT,它带有x-dead-letter-exchange和x-dead-letter-routing-key,它将路由到默认的交换,并到达我的目标队列STAT 当我需要将延迟消息调度到queue STAT时,我将消息发布到delay_STAT with expiration,当到达消息ttl时,它将是一个死信,然后被路由到STAT以便可以使用它 但我遇到了一个问题,根据 设置每封邮件时,TTL过期邮件可以在后面排队 未过期的,直到后者被

我需要调度延迟消息,因此我声明了一个延迟队列delay_STAT,它带有x-dead-letter-exchange和x-dead-letter-routing-key,它将路由到默认的交换,并到达我的目标队列STAT

当我需要将延迟消息调度到queue STAT时,我将消息发布到delay_STAT with expiration,当到达消息ttl时,它将是一个死信,然后被路由到STAT以便可以使用它

但我遇到了一个问题,根据

设置每封邮件时,TTL过期邮件可以在后面排队 未过期的,直到后者被消费或过期


这意味着如果B提前发送,一些短延迟消息A将被长延迟消息B阻塞。

如果您想安排消息发送,您可以发送到 执行以下操作

  • 将消息发布到队列时,必须计算消息的TTL
  • 在RabbitMQ中,必须将消息发布到特定时间窗口的队列中
  • 当TTL过期时,消息将消失,并且使用x-dead-letter-exchange将传输到目标队列,在该队列中将被消费
  • 例如

    让我们假设您的时间窗口为60秒,因此您将有一个单独的队列,用于TTL介于0到59秒(含)之间、名称为的消息,例如
    queue.dlx.0
    、TTL介于60到119秒之间、名称为
    queue.dlx.0
    的消息,等等

    您知道,对于当前消息,TTL等于50秒。然后,您可以定义延迟队列名称
    queue.dlx
    +Math.floor(50/60)

    当消息TTL过期时,它将消失并进入队列,在那个里您有一个消费者来处理消息

    此外,您可以为每条消息创建一个队列,并设置队列TTL(
    x-expires
    ),以在消息TTL过期后删除队列(消息TTL+几秒钟以防万一)

    见下图:

    (来源-[RUS])

    另外,你可以看看这个插件

    Math.floor-JS函数将小数舍入为最小整数