首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用message实现计划消息、RabbitMQ时,消息会被阻塞

当使用message实现计划消息、RabbitMQ时,消息会被阻塞
EN

Stack Overflow用户
提问于 2018-06-22 06:37:07
回答 1查看 319关注 0票数 0

我需要安排延迟消息,所以我声明了一个带有x死信交换和x死信路由密钥的延迟队列DELAY_STAT,它将路由到默认的交换到我的目标队列统计数据。

当我需要为队列STAT安排延迟消息时,我会在到期时将消息发布到DELAY_STAT,当到达消息ttl时,它将是一个死信,然后路由到STAT,以便可以使用它。

但是我遇到了一个问题,据https://www.rabbitmq.com/ttl.html#per-message-ttl-caveats

当设置每条消息时,TTL过期消息可以排在未过期消息的后面,直到后者被使用或过期为止。

这意味着如果B更早地发送,一些短延迟消息A将被长延迟消息B所堆积。

EN

回答 1

Stack Overflow用户

发布于 2018-06-22 07:26:00

如果您想安排发送邮件,您可以执行以下操作。

  1. 当您将消息发布到队列时,您必须为消息计算一个TTL。
  2. 在RabbitMQ中,您必须将消息发布到特定时间窗口的队列中。
  3. 当TTL过期时,消息将终止,使用x死信交换将传输到目标队列,在那里将被消耗。

例如。

让我们假设您的时间窗口是60秒,所以您将有一个单独的队列来处理具有TTL的消息,在0到59秒之间(包括名字),例如queue.dlx.0,一个单独的队列用于60到119秒的消息队列,名称为queue.dlx.0,等等。

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

当message过期时,它会死掉,然后进入队列,在那里有一个使用者来处理这些消息。

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

见图:images/1a2/95d/14f/1a295d14fbeea180e17636a86e8fbce6.png

(来源:https://habr.com/post/235983/ RUS)

另外,您也可以看看这个插件https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

Math.floor - JS函数将小数圈到最小整数.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50982035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档