Rails API - 并行处理多个交易 - 平衡支付

时间:2013-08-18 01:53:32

标签: ios ruby-on-rails asynchronous parallel-processing balanced-payments

我为我的iOS应用程序设置了一个rails API。我们有一个群组拆分功能,允许人们邀请人们加入他们的小组,并平分整个账单。它目前已实现并且运行良好但随着组大小的增加,处理事务的时间确实变慢(由于它们处于循环中而不是一次性完成)。

我很好奇是否有其他人已经处理了类似的事情或有任何资源指出我正确的方向这样的事情。目前,我们正在对每个集团成员卡进行搁置,如果所有成功保留成功,我们将捕获它们。我们这样做是为了确保群组卡中没有人反弹,如果我们直接记入卡,我们可能会对退款负责,如果有人卡反弹的话。我们正在使用Balanced Payments ruby​​客户端。

我见过赛璐珞宝石或sidekiq。我通常会做所有的iOS工作,但是我们一直很难找到一个好的人来做这个API,我决定尝试一下这个应用程序,到目前为止一直很好,直到遇到这个问题。

@booking.group.group_members.each do |group_member|
        credit_card = CreditCard.find(group_member.credit_card_id)
        customer = Balanced::Account.find(group_member.user.customer_uri)

        booking = Booking.create(:venue_id => @venue.id,
                              :user_id => group_member.user_id,
                              :group_id => @booking.group_id,
                              :subtotal => @booking.subtotal / @group_count,
                              :total => @booking.total / @group_count,
                              :gratuity_fee => @booking.gratuity / @group_count,
                              :credit_card_fee => @booking.fees / @group_count,
                              :credit_card_id => group_member.credit_card_id,
                              :receipt_id => @booking.id,
        )

        begin
          hold = customer.hold({:amount => ((booking.subtotal + booking.booking_fee + booking.gratuity_fee  + booking.credit_card_fee) * 100).to_int,
                                :on_behalf_of_uri => @merchant_uri,
                                :appears_on_statement_as => "...",
                                :source_uri => credit_card.credit_card_uri}
          )

        rescue Balanced::Error => error
            #handle errors
            render json: error.description, status: error.status_code
          end
        end
      end

这就是我在每张牌上放置保留的方式。有没有人对如何并行处理所有这些而不是顺序处理有任何想法。我知道sidekiq或赛璐珞可以处理类似的东西很容易,但我担心如果处理付款时出现错误,如果他们一次处理所有,如何处理它们。

1 个答案:

答案 0 :(得分:1)

如果您made your Rails app thread-safe,则可以调用Thread.new并在单独的帖子中处理每个客户。然后,当您加入线程时,您可以检查错误并继续。

有关如何使用线程here的更多信息。

如果组可能变得非常大,您可能希望限制并发线程的数量。我通常将线程保存在一个数组中,如果它达到一个大小限制,我会在继续之前加入第一个。