Limitar cantidad de conexiones a una API

(es)

ruby

Tenemos una API a la cual debemos hacer múltiples actualizaciones, cada actualización toma entre 1 y 2 segundos en hacer la request pero hay que actualizar entre 3000 y 4000 ids distintos, lo cual se estaba haciendo secuencial y demoraba entre 7 y 10 minutos en terminar.

Esto se estaba ejecutando en un worker de sidekiq, pero la tarea estaba bloqueando la ejecucion de otras tareas.

Para solucionarlo, pense en utilizar hebras para lanzar las distintas request y no hacerlo de manera secuencial.

El problema fue que al crear una hebra por cada request, salieron muchas request en muy poco tiempo bloqueando el endpoint al cual queriamos actualizar.

Para solucionar este problema, implementamos un contador para que hiciera X cantidad de requests y luego espere unos N segundos antes de mandar los siguientes X cantidad de request.

Nota: Trata de no hacer llamados sql en multi hebra para no sobrepasar límite de consultas por segundo de la base de datos

def update_products(sleep_time = 4, threads_between_sleeps = 25)
ids = Product.enabled.needing_update.pluck(:id)
ids.each_with_index do |product_id, i|
sleep(sleep_time) if (i % threads_between_sleeps).zero?
Thread.new do
update_webhook { product_id: }
end
end
end

De esta manera dejamos configurado que hiciera 25 requests y luego espere 4 segundos antes de hacer el siguiende bloque de 25 requests.