Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RabbitMQ-计划队列-死信队列-良好实践_Rabbitmq_Bunny - Fatal编程技术网

RabbitMQ-计划队列-死信队列-良好实践

RabbitMQ-计划队列-死信队列-良好实践,rabbitmq,bunny,Rabbitmq,Bunny,我们已经用Rabbit设置了一些工作流环境 它解决了我们的需求,但我想知道,像我们为预定任务所做的那样做是否也是一种很好的练习 调度意味着没有任务关键型100%调整时间。因此,如果一个作业应该在60秒后重试,它确实意味着60秒以上,这取决于处理队列的时间 我已经创建了一个Q_WAIT,并为传输设置创建了一些标题 让我们像这样做: 工人正在运行Q_操作 如果操作丢失(例如,无法访问smtp服务器) ->(重新)将消息发布到Q_WAIT并设置属性。标头[“已计划”]=时间+60秒 另一个进程每15

我们已经用Rabbit设置了一些工作流环境

它解决了我们的需求,但我想知道,像我们为预定任务所做的那样做是否也是一种很好的练习

调度意味着没有任务关键型100%调整时间。因此,如果一个作业应该在60秒后重试,它确实意味着60秒以上,这取决于处理队列的时间

我已经创建了一个Q_WAIT,并为传输设置创建了一些标题

让我们像这样做:

工人正在运行Q_操作

如果操作丢失(例如,无法访问smtp服务器)

->(重新)将消息发布到Q_WAIT并设置属性。标头[“已计划”]=时间+60秒


另一个进程每15秒循环一次,通过方法pop()而不是通过订阅,遍历Q_WAIT中的所有消息

q_WAIT.pop(:ack => true) do |delivery_info,properties,body|...

  if (properties.headers["scheduled"] has reached its time)

     -> (Re-)Publish the message back to Q_ACTION
        ack(message)

在每次循环之后,连接都会关闭,因此未(重新)发布的内容将留在Q_等待中,因为它们未被确认



有人能确认这是一个有效的(好的)实践吗。

确保您可以使用原始问题中描述的循环过程

此外,您还可以使用

首先,指定
x-dead-letter-exchange
Q_WAIT
队列参数等于当前交换,
x-dead-letter-routing-key
等于
Q_操作
绑定的路由键

然后设置
x-message-ttl
queue-argument set或set message expires属性,如果您需要自定义每条消息的ttl(虽然有一些,但这不是最佳做法,但也很有效)

在这种情况下,您的消息将在ttl过期后立即从
Q_WAIT
Q_ACTION
以死信形式发送,而不需要任何额外的使用者,这将更加可靠和稳定


注意,如果您需要高级重新发布逻辑(更改消息正文、属性),您需要额外的队列(例如
Q\u PRE\u ACTION
)来使用来自的消息,更改它们,然后发布到目标队列(例如
Q\u ACTION
)。

请确保您可以使用原始问题中描述的循环过程

此外,您还可以使用

首先,指定
x-dead-letter-exchange
Q_WAIT
队列参数等于当前交换,
x-dead-letter-routing-key
等于
Q_操作
绑定的路由键

然后设置
x-message-ttl
queue-argument set或set message expires属性,如果您需要自定义每条消息的ttl(虽然有一些,但这不是最佳做法,但也很有效)

在这种情况下,您的消息将在ttl过期后立即从
Q_WAIT
Q_ACTION
以死信形式发送,而不需要任何额外的使用者,这将更加可靠和稳定


注意,如果您需要高级重新发布逻辑(更改消息正文、属性),您需要额外的队列(例如
Q\u PRE\u ACTION
)来使用来自的消息,更改它们,然后发布到目标队列(例如
Q\u ACTION
)。

请确保您可以使用原始问题中描述的循环过程

此外,您还可以使用

首先,指定
x-dead-letter-exchange
Q_WAIT
队列参数等于当前交换,
x-dead-letter-routing-key
等于
Q_操作
绑定的路由键

然后设置
x-message-ttl
queue-argument set或set message expires属性,如果您需要自定义每条消息的ttl(虽然有一些,但这不是最佳做法,但也很有效)

在这种情况下,您的消息将在ttl过期后立即从
Q_WAIT
Q_ACTION
以死信形式发送,而不需要任何额外的使用者,这将更加可靠和稳定


注意,如果您需要高级重新发布逻辑(更改消息正文、属性),您需要额外的队列(例如
Q\u PRE\u ACTION
)来使用来自的消息,更改它们,然后发布到目标队列(例如
Q\u ACTION
)。

请确保您可以使用原始问题中描述的循环过程

此外,您还可以使用

首先,指定
x-dead-letter-exchange
Q_WAIT
队列参数等于当前交换,
x-dead-letter-routing-key
等于
Q_操作
绑定的路由键

然后设置
x-message-ttl
queue-argument set或set message expires属性,如果您需要自定义每条消息的ttl(虽然有一些,但这不是最佳做法,但也很有效)

在这种情况下,您的消息将在ttl过期后立即从
Q_WAIT
Q_ACTION
以死信形式发送,而不需要任何额外的使用者,这将更加可靠和稳定


注意,如果需要高级重新发布逻辑(更改消息正文、属性),则需要额外的队列(例如
Q\u PRE\u ACTION
)来使用来自的消息,更改它们,然后发布到目标队列(例如
Q\u ACTION
).

正如我在评论中提到的那样,我尝试了
x-dead-letter-exchange
的功能,它适用于大多数需求。一个问题/误解是TTL-PER-MESSAGE选项

请看下面的例子。据我了解:

  • DLQ的超时时间为10秒
  • 因此,第一条消息将在发布10秒后在订阅服务器上可用
  • 第二条消息在第一条消息后1秒发布,消息ttl(过期)为3秒
  • 我希望第二条消息应该在发布3秒后和第一条消息之前被禁止发布

    但它不是那样工作的,两个都在10秒后可用

    Q:消息过期不应该推翻DLQ ttl吗?

    #/usr/bin/env ruby
    #编码:utf-8
    需要“兔子”
    B=Bunny.new ENV['CLOUDAMQP_URL']
    开始
    耽搁了_QUEUE='work.later'
    目的地_