Mi API responde a consultas que pueden devolver alrededor de 100,000 modelos llamados MOF. Cada modelo tiene una columna json llamada 'pregen_json' que almacena en caché el estado actual del modelo. Esto se almacena en caché porque generar el json en tiempo real es demasiado lento (~ 40 ms / modelo * 100,000 modelos = 1 hora). Aquí está el bit relevante del esquema (ejecutando mySQL) + código:

Esquema:

  create_table "mofs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    ...
    t.json "pregen_json"
  end

Controlador:

        # some filtering of @mofs to respond to search query omitted
        render :json => @mofs.pluck(:pregen_json)

Tiempo de descarga basado en la longitud de @mofs [m: s]

1,000 -> 0:10

10,000 -> 2:00

100,000 -> 7:00

Básicamente, el usuario ve un 90% de tiempo de espera sin datos y luego todo se envía de una vez después de que el servidor prepara la respuesta.

Buscando sugerencias sobre cómo acelerar esto.

0
nlta 22 nov. 2019 a las 20:13

1 respuesta

La mejor respuesta

En general, para evitar llamadas API extremadamente largas, las personas paginan sus resultados. El cliente solicita una determinada página (y / o una cierta cantidad de resultados) y el servidor devuelve exactamente eso.

Hay muchas gemas de rubí de paginación como Will Paginate o Kaminari que te ayudará a hacer eso.

De lo contrario, es bastante simple implementar la paginación básica usted mismo usando limit y offset Model.limit(PAGE_SIZE).offset(PAGE_SIZE * page_number).

Es posible que desee agregar botones para que el cliente pueda seleccionar la página que desea cargar. Si su deseo es cargar todo, puede crear un bucle que siga solicitando las páginas siguientes hasta que ya no se devuelvan datos. La ventaja aquí es que los datos se cargarán con el tiempo en lugar de todos a la vez después de un largo período de tiempo.

Aparte de eso, me sorprende que obtener 100,000 récords demore 7 minutos. Es posible que desee poner solo la información necesaria en ese JSON pregenerado para limitar la cantidad de datos que se extraen de la base de datos al cliente.

Espero que esto te ayude a tomar una decisión. ¡Buena suerte!

0
Phenixer 22 nov. 2019 a las 19:04