Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Sidekiq是否适用于任务高度关键、需要一次性执行保证、需要单线程执行的任务?_Ruby On Rails_Transactions_Backgroundworker_Payment_Sidekiq - Fatal编程技术网

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

Ruby on rails Sidekiq是否适用于任务高度关键、需要一次性执行保证、需要单线程执行的任务?,ruby-on-rails,transactions,backgroundworker,payment,sidekiq,Ruby On Rails,Transactions,Backgroundworker,Payment,Sidekiq,示例场景: 支付处理和电子产品交付交易 要求 每天大约有几千笔支付交易需要执行。每次大约需要1秒钟。(所以整个过程大约需要一个小时) 事务必须在单个线程中线性处理(在最后一个事务完成之前,下一个事务不得启动,需要强FIFO顺序) 每个支付事务都被包装在数据库事务中,任何返回以回滚事务的内容都会被中止并放入另一个队列中进行手动错误处理。之后,它应该继续处理其余的事务 重要性顺序 单次执行(如果失败,则放入错误队列进行手动处理) 单线性 先进先出 Sidekiq是否适用于此类关键任务流程?sidek

示例场景:

支付处理和电子产品交付交易

要求

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

  • 单次执行(如果失败,则放入错误队列进行手动处理)
  • 单线性
  • 先进先出
  • Sidekiq是否适用于此类关键任务流程?sidekiq能够满足所有这些要求吗?或者你会推荐其他替代方案吗?你能告诉我一些关于rails中支付处理的最佳实践吗

    注意:问题不在于是否使用stripe或ActiveMerchant进行支付处理。更多的是关于在后台以编程方式执行这些进程的最安全方式。

    在最后一个事务完成之前,不得启动下一个事务

    在这种情况下,我认为后台处理是合适的,只要您在完成前一个作业时创建下一个作业

    class Worker
      include Sidekiq::Worker
    
      def perform(*params)
        # do work, raising exception if necessary
    
        NextWorker.perform_async(params, here)
      end
    end
    

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

    要以串行方式一次处理一个事务,您可以启动并发度为1的single Sidekiq进程,该进程只在该队列上工作。该进程将按顺序逐个处理队列中的作业

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

    为了保证每个任务至少执行一次,您可以购买并使用可靠的Fetch。如果Sidekiq崩溃,它将在启动备份时执行任务。这假设您将设置监视以确保Sidekiq进程保持运行。您可能还希望使任务幂等,这样它就不会两次写入同一事务。(理论上,在数据库事务提交之后,但在Sidekiq向Redis报告任务完成之前,进程可能会崩溃。)

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