【问题标题】:Ruby AMQP persistent message is deleted after restarting RabbitMQ重启 RabbitMQ 后删除 Ruby AMQP 持久消息
【发布时间】:2011-07-17 12:12:32
【问题描述】:

我有一个 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 服务器重新启动,则消息不再位于启动队列(或任何队列,就此而言)。消息不是持久的,我做错了什么?我也尝试过显式创建持久交换,并将队列绑定到该交换,但是在 RabbitMQ 重启后消息仍然被删除。

【问题讨论】:

  • 你运行的是什么版本的 RabbitMQ?您使用什么选项运行它?
  • RabbitMQ 版本为 2.2.0;默认选项。

标签: ruby rabbitmq amqp


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    有趣的是,我只是在谷歌上搜索同样的问题。 RabbitMQ 2.2.0,默认选项。就我而言,Ruby 客户端使用 EPEL 的 ruby​​gem-amqp-0.6.7-3.el5。持久队列绑定到持久扇出交换,使用 :persistent => true 发布消息。服务器重新启动时消息丢失。 -艾伦

    【讨论】:

    • 认为我有我的答案...正在运行“rabbitmq-server start”,而不是使用 rabbitmqctl 或 RedHat 初始化脚本来停止服务器。显然,第一个版本在前台运行,并且 control-C 停止服务器而不启动缓存消息的刷新。好像使用控制脚本一样。
    • 谢谢,这解决了我的问题。奇怪的是,在通过sudo rabbitmqctl stop 停止服务器一次后,rabbitmq-server 的后续启动和通过 control-C 中止的消息仍然存在。
    【解决方案3】:

    是的,西蒙是对的。关于发布者确认(描述于http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms),我计划在即将发布的 AMQP 0.8 中支持它们。

    顺便说一句,在原始示例中,发布的第一个参数应该是实际数据,其他所有内容都通过选项指定,因此它是发布(消息,选择)而不是发布(消息 ID,选择)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 2020-01-10
      • 2015-12-19
      • 2012-12-26
      • 2019-11-04
      • 1970-01-01
      • 2013-12-30
      • 2018-07-24
      相关资源
      最近更新 更多