【问题标题】:requeue a sweatshop job in RabbitMQ在 RabbitMQ 中重新排队血汗工厂作业
【发布时间】:2010-01-05 13:04:18
【问题描述】:

我正在开发一个 Rails 应用程序,将客户退款交给 Sweatshop 工作人员。如果退款失败(因为我们当时无法联系到付款处理方)我想重新排队。

class RefundWorker < Sweatshop::Worker

def process_refund(job)
  if refund
    Transaction.find(job[:transaction]).update_attributes(:status => 'completed')
  else
    sleep 3
    RefundWorker.async_process_refund(job)   # requeue the job
  end
end

有没有比上面更好的方法来做到这一点?我在 RabbitMQ 中没有发现任何“延迟”功能,这是迄今为止我想出的最好的解决方案。我想在重新排队时避免繁忙的循环。

【问题讨论】:

    标签: ruby-on-rails ruby message-queue rabbitmq


    【解决方案1】:

    你看过若特和小黄人之类的东西吗?

    这里有一些链接:http://delicious.com/alexisrichardson/rabbitmq+work+ruby

    你也可以试试 Celery,它不会说原生 Ruby,但会说 HTTP+JSON。

    以上所有内容都适用于 RabbitMQ,因此可能会对您有所帮助。

    干杯

    亚历克斯

    【讨论】:

    • 感谢您的替代客户。我真的宁愿尽可能地坚持使用 Ruby,Sweatshop/Carrot 一直运行良好。它们似乎不是 AMQP 中的延迟功能,因此此时重新排队似乎是最佳选择。我在开发中的代码可以按我的意愿工作,只是想知道是否有更好的方法。
    【解决方案2】:

    有定时送达服务吗?您将发送消息以作为有效负载交付,并以交付时间结束,并且服务将保留消息,直到达到指定的时间。据我所知,RabbitMQ 服务器或任何 AMQP 客户端库中都不存在类似的东西,但拥有它会很有用。

    【讨论】:

    • celery 对带有 eta/倒计时的任务执行此操作。它只保留消息,并且有一个调度程序在满足 eta 时执行任务。由于需要确认消息,因此保留它们不是问题,尽管在使用 QoS 预取计数时有点奇怪,因为我们必须在每次收到带有 eta 的消息时增加预取计数,并在当eta 消息已被处理。
    【解决方案3】:

    AMQP(或至少 RabbitMQ)似乎不支持“延迟这项工作”的想法。因此,如果工作失败,则从工作人员内部重新排队同一作业的方法似乎是目前最好的解决方案。

    我的代码在演示环境中运行,到目前为止它满足了我的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多