RabbitMQ-计划队列-死信队列-良好实践
我们已经用Rabbit设置了一些工作流环境 它解决了我们的需求,但我想知道,像我们为预定任务所做的那样做是否也是一种很好的练习 调度意味着没有任务关键型100%调整时间。因此,如果一个作业应该在60秒后重试,它确实意味着60秒以上,这取决于处理队列的时间 我已经创建了一个Q_WAIT,并为传输设置创建了一些标题 让我们像这样做: 工人正在运行Q_操作 如果操作丢失(例如,无法访问smtp服务器) ->(重新)将消息发布到Q_WAIT并设置属性。标头[“已计划”]=时间+60秒RabbitMQ-计划队列-死信队列-良好实践,rabbitmq,bunny,Rabbitmq,Bunny,我们已经用Rabbit设置了一些工作流环境 它解决了我们的需求,但我想知道,像我们为预定任务所做的那样做是否也是一种很好的练习 调度意味着没有任务关键型100%调整时间。因此,如果一个作业应该在60秒后重试,它确实意味着60秒以上,这取决于处理队列的时间 我已经创建了一个Q_WAIT,并为传输设置创建了一些标题 让我们像这样做: 工人正在运行Q_操作 如果操作丢失(例如,无法访问smtp服务器) ->(重新)将消息发布到Q_WAIT并设置属性。标头[“已计划”]=时间+60秒 另一个进程每15
另一个进程每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选项
请看下面的例子。据我了解:
#/usr/bin/env ruby
#编码:utf-8
需要“兔子”
B=Bunny.new ENV['CLOUDAMQP_URL']
开始
耽搁了_QUEUE='work.later'
目的地_