gpt4 book ai didi

重启 RabbitMQ 后删除 Ruby AMQP 持久消息

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:39 25 4
gpt4 key购买 nike

我有一个 ruby​​ 脚本,它使用 RabbitMQ 中的 AMQP 创建一条消息。

# above code sets up config for connecting to RabbitMQ via APMQ
AMQP.start(:host => 'localhost') do
amq = MQ.new
amq.queue('initiate', :durable => true).publish(message_id, :persistent => true)
AMQP.stop{ EM.stop }
end

如果 RabbitMQ 服务器重新启动,则消息不再位于启动队列(或任何队列,就此而言)中。消息不是持久的,我做错了什么?我还尝试过显式创建持久交换,并将队列绑定(bind)到该交换,但在 RabbitMQ 重启后消息仍然被删除。

最佳答案

如前所述,如果您只是将消息标记为持久化,它们不一定会立即持久化,因此如果服务器意外关闭,它们可能永远不会在磁盘上结束。

那么,如果您真的需要将消息保存在磁盘上,即使服务器崩溃了,您会怎么做?

您可以做两件事。一种是将您的发布包装在交易中。当您提交事务时,消息将在磁盘上(当然,如果它尚未交付给消费者)。但是,这会添加对服务器的同步调用,因此会减慢您的速度。如果您知道要发布大量消息,您可以将一堆发布包装在一个事务中,然后当您提交时,您知道它们都在磁盘上。

另一种(更高性能)替代方法是使用发布确认。但这些是 2.3.1 服务器中的新功能,我认为还没有任何 Ruby 客户端支持它们。

最后,RabbitMQ 无论如何都会定期将持久消息刷新到磁盘,即使在没有确认、事务和受控关闭的情况下也是如此。但是 2.2.0 中存在一个错误,这意味着这种情况有时不会发生很长时间,因此升级到 2.3.1 可能是值得的。

关于重启 RabbitMQ 后删除 Ruby AMQP 持久消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com