Respuesta adecuada a la solicitud HTTP cuando se solicitan demasiados datos

8

Estoy creando una API para una plataforma de publicación de anuncios que le permitirá solicitar datos de seguimiento para campañas publicitarias. Las campañas a menudo exceden cientos de millones de solicitudes, lo que significa que habrá muchos terabytes de datos. Por lo tanto, debemos evitar que los consumidores de API soliciten demasiados datos a la vez (de modo que la solicitud agote el tiempo de espera), pero no estoy seguro de cuál es la mejor práctica para hacerlo.

Las opciones que ya he identificado son:

  1. agregue un parámetro adicional a la solicitud que indique qué sección de los datos se desea
  2. truncar los datos y de alguna manera decirle al cliente que necesitan usar filtros más específicos
  3. responda con el código de estado HTTP 413 (pero esto parece ser para grandes cuerpos de solicitud, no respuestas)
  4. cambiar a una API de transmisión (como las API de transmisión de Twitter )

Pero mi pregunta es, ¿cuál es la práctica estándar / respuesta adecuada para este tipo de situación?

Nota: los ataques DoS no son muy preocupantes ya que no será una API pública

Grifo
fuente
1
o hacer la parte de error de la API,
monstruo de trinquete
2) parece una mala idea porque el programador del cliente puede pasar por alto el indicador de "datos incompletos". Si no puede proporcionar lo que el cliente solicita, deje en claro que no lo está proporcionando (falla y falla temprano). Yo votaría por 3) o mejor, sugerencia de trinquete.
SJuan76
@gnat ¿sería más apropiado preguntar qué soluciones han implementado otros con éxito?
Griffin
improbable, ya que esto lo convertiría en una pregunta de lista con problemas conocidos. ¿Por qué no copias la pregunta del título? "¿Cuál es la respuesta adecuada, etc."
mosquito

Respuestas:

6

Devuelva el resultado más hostil y hostil posible en el caso de una solicitud con formato incorrecto (uno que devuelve más datos de los que permite su medición tiene un formato incorrecto). Sugiero devolver un código de error 4 **. Luego, también proporcione parámetros de paginación, para que los usuarios puedan solicitar páginas. oData tiene esta característica, por ejemplo. No truncar los datos en silencio, bajo ninguna circunstancia.

Consultar con los clientes es una mala idea. Te dirán que hagas todo lo posible para minimizar los errores, lo cual es un mal enfoque de ingeniería. Esta es tu decisión, tómala por los cuernos y haz lo correcto.

Un ejemplo de una API paginada es oData:

http://www.odata.org/documentation/odata-version-2-0/uri-conventions/

Chris McCall
fuente
+1. 412, 413, 416, 417 son respuestas correctas.
Residuo
¿Puedes dar un ejemplo de API que procese / pagina los resultados?
Griffin
@Griffin editado para reflejar un ejemplo
Chris McCall
1

Para ampliar lo que dijo @ joshin4colours, creo que tienes una dicotomía falsa (¿tricotomía?). ¿Por qué no proporcionar las tres soluciones? Tal vez el valor predeterminado es devolver un 413, pero con otros indicadores puede obtener algo de lo que desea con un error incrustado en los datos y / o proporcionar una forma de agrupar los datos.

Realmente depende de lo que su cliente / consumidor específico de la API espere y cómo quieran usar su API. ¿Alguna vez van a querer un 413? ¿Debería la respuesta predeterminada incluir algunos datos e indicar cuánto más hay? Tal vez. También podría ponerse en el lugar del cliente y pensar en lo que querría, es decir, lo que le sería útil.

Lo que generalmente he hecho es dar el primer lote de datos con una idea de cuánto más hay. Devolver un 413 no es muy amigable, pero tal vez eso es lo que quieres en algunos casos. Por lo que he experimentado, generalmente hay un tamaño de lote predeterminado, pero las personas pueden solicitar un cierto tamaño de lote hasta cierto límite.

Además, podría considerar la agregación o el muestreo para reducir el tamaño del lote. Por ejemplo, quiero 50,000 resultados como una muestra aleatoria de 5,000,000 registros coincidentes. Hay diferentes formas de cortar y cortar en función de cuán estadísticamente significativo desee que sean sus resultados.

zerodiff
fuente
correcto, consultar a los clientes reales siempre es una buena idea. Mientras tanto, me gustaría explorar qué soluciones han funcionado para otros.
Griffin
0

No estoy seguro acerca de una mejor práctica, pero en nuestro caso tenemos parámetros en nuestra API que están establecidos en algún tipo de valor máximo (piense en Integer.MAX_VALUE de Java). Estos parámetros a menudo no están disponibles para la UI / lado del cliente de la aplicación, solo para llamadas del lado del servidor.

Básicamente, el enfoque sería establecer un máximo en los registros devueltos por su solicitud. Parece funcionar bien, particularmente cuando los datos no necesitan ser organizados o paginados de ninguna manera.

Si un cliente (humano o de otro tipo) necesita más que este máximo, puede considerar aumentarlo o agrupar sus datos de alguna manera.

joshin4colours
fuente
1
y por lo menos los documentos Maxes cuando se filtran a través de la abstracción
monstruo de trinquete