ruby-on-rails - Sidekiq 是否适用于高度关键任务、需要一次性执行保证、需要单线程执行的任务?

标签 ruby-on-rails transactions backgroundworker payment sidekiq

示例场景:

付款处理和电子产品交付交易。

需求

  • 每天大约有几千笔支付交易需要执行。每个大约需要 1 秒钟。 (所以整个过程大概需要一个小时)
  • 事务必须在单个线程中线性处理(下一个事务必须在最后一个事务完成后才开始,需要强 FIFO 顺序)
  • 每个支付交易都包含在一个数据库交易中,任何回滚交易的东西都会被中止并放入另一个队列以进行手动错误处理。之后,它应该继续处理其余的交易。

  • 重要性顺序
  • 单次执行(如果失败,放入错误队列手动处理)
  • 单线程
  • 先进先出

  • Sidekiq 是否适合此类任务关键型流程? sidekiq 能否满足所有这些要求?或者你会推荐其他替代品吗?你能给我指出一些关于 Rails 支付处理的最佳实践吗?
    Note: The question is not regarding whether to use stripe or ActiveMerchant for payment handling. It is more about the safest way to programmatically execute those processes in the background.

    最佳答案

    是的,Sidekiq 可以满足所有这些要求。

    要以串行方式一次处理一个事务,您可以启动一个并发为 1 的 Sidekiq 进程,该进程仅适用于该队列。该进程将按顺序一次一个地处理队列中的作业。

    对于进入失败队列的失败任务,您需要使用 Sidekiq Failures gem 并确保为该任务关闭重试。

    为保证每个任务至少执行一次,您可以购买Sidekiq Pro并使用可靠获取。如果 Sidekiq 崩溃,它会在启动备份时执行任务。这假设您将设置监控以确保 Sidekiq 进程保持运行。您可能还想让您的任务具有幂等性,因此它不会两次写入相同的事务。 (理论上,在您的数据库事务提交之后,但在 Sidekiq 向 Redis 报告任务已完成之前,该进程可能会崩溃。)

    如果使用 Ruby 是一个限制,Sidekiq 可能是你最好的选择。我在 Ruby 中使用了几种不同的排队系统,但它们都没有 Sidekiq 那样的可靠性保证。

    关于ruby-on-rails - Sidekiq 是否适用于高度关键任务、需要一次性执行保证、需要单线程执行的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916022/

    相关文章:

    c# - 如何从 backgroundworker C# 返回多个结果

    C#,后台 worker 类

    c# - Backgroundworker RunWorkerCompleted 事件甚至在完成工作之前就已触发

    ruby-on-rails - Rails foo= 与 foo_id=

    mysql - MySQL Innodb 中的悬空事务

    java - JPA/@PostPersist @PostUpdate - 交易

    mysql - 如何找出可能发生 COMMIT 的位置?

    javascript - jQuery 在本地主机上加载,但在 Heroku 上不加载

    html - 使用 remotipart 提交带有文件输入的表单包装一个文本区域以响应

    ruby-on-rails - ruby/rails array 两个索引之间的所有元素