Rails API – Procesar transactions múltiples en paralelo – Pagos balanceados

He configurado una API de Rails para mi aplicación iOS. Tenemos una function de split grupal que permite a las personas invitar a personas a su grupo y dividir por igual la totalidad de la factura. Actualmente está implementado y funciona bien, pero a medida que el tamaño del grupo crece, el time para procesar las transactions realmente se ralentiza (debido a que están en un ciclo y no de una vez).

Tengo curiosidad si alguien más ha abordado algo similar o tiene algún recurso para apuntarme en la dirección correcta para algo como esto. Actualmente, colocamos retenidas en cada una de las tarjetas de los miembros del grupo y si todas las retenciones son exitosas, las capturamos. Hacemos esto para asegurar que nadie en la tarjeta de grupo rebote, si fuimos directamente a debitar las tarjetas, podríamos ser responsables de las devoluciones de cargo si la tarjeta de algún jugador rebotó. Estamos usando el cliente ruby ​​Payments ruby.

He visto la joya de celuloide o sidekiq. Por lo general, hago todo el trabajo de iOS, pero hemos tenido muchas dificultades para lograr que alguien haga la API y decidí probarlo para esta aplicación, hasta ahora, hasta que encontré este problema.

@booking.group.group_members.each do |group_member| cnetworkingit_card = CnetworkingitCard.find(group_member.cnetworkingit_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, :cnetworkingit_card_fee => @booking.fees / @group_count, :cnetworkingit_card_id => group_member.cnetworkingit_card_id, :receipt_id => @booking.id, ) begin hold = customer.hold({:amount => ((booking.subtotal + booking.booking_fee + booking.gratuity_fee + booking.cnetworkingit_card_fee) * 100).to_int, :on_behalf_of_uri => @merchant_uri, :appears_on_statement_as => "...", :source_uri => cnetworkingit_card.cnetworkingit_card_uri} ) rescue Balanced::Error => error #handle errors render json: error.description, status: error.status_code end end end 

Así es como estoy colocando las reservas en cada una de las tarjetas. ¿Alguien tiene alguna idea sobre cómo podría procesar todo esto en paralelo en lugar de secuencialmente? Sé que sidekiq o celuloide podrían manejar algo similar bastante fácil, pero me preocupa si se produce un error al procesar el pago y cómo manejarlos si se procesan todo al mismo time.

Si ha hecho que la aplicación de Rails sea segura para subprocesss , puede llamar a Thread.new y procesar cada cliente en un hilo separado. Luego, cuando te unes a los hilos, puedes verificar si hay errores y continuar.

Más sobre cómo trabajar con subprocesss aquí .

Si los grupos pueden ser muy grandes, probablemente querrá limitar la cantidad de subprocesss simultáneos. Por lo general, mantengo los hilos en una matriz y, si alcanza un límite de tamaño, me uno al primero antes de continuar.