RESTO pasi贸n por 200



Hace tiempo que quer铆a escribir este art铆culo. Me preguntaba de qu茅 lado entrar m谩s correctamente. Pero, de repente, recientemente, apareci贸 un art铆culo similar sobre Habr茅, que caus贸 una tormenta en un vaso. Lo que m谩s me sorprendi贸 fue el hecho de que el art铆culo comenz贸 a manejarse en menos, aunque ni siquiera declar贸 algo, sino que plante贸 la cuesti贸n del uso de c贸digos de respuesta del servidor web en REST. El debate estall贸 en caliente. Y la apoteosis fue que el art铆culo entr贸 en borrador ... kilobytes de comentarios, opiniones, etc. Solo desapareci贸. Muchos se convirtieron en v铆ctimas del karmo, considere, para nada :)

En general, fue el destino de ese art铆culo lo que me impuls贸 a escribir este. Y realmente espero que sea 煤til y aclare mucho.

Te advierto que todo lo escrito a continuaci贸n es una experiencia real, no un acto de equilibrio cognitivo. Y as铆, condujeron.

HTTP


Lo primero que debe hacer es separar muy claramente las capas. La capa de transporte es http. Bueno, en realidad DESCANSO. Esto es algo fundamentalmente importante para aceptar todo y "usted mismo" en 茅l. Hablemos solo sobre http primero.

Us茅 el t茅rmino "capa de transporte". Y no hice una reserva. La cuesti贸n es que http implementa las funciones de transporte de solicitudes al servidor y contenido al cliente, independientemente de tcp / ip. S铆, se basa en tcp / ip. Y parece que es necesario considerarlo como su transporte. Pero no Y esta es la raz贸n: las conexiones de socket no son directas, es decir Esta no es una conexi贸n cliente-servidor. Tanto la solicitud http como la respuesta http pueden recorrer un largo camino a trav茅s de una tonelada de servicios. Se pueden agregar o descomponer por el contrario. Puede ser almacenado en cach茅, puede ser modificado.

Es decir tanto la solicitud http como la respuesta http tienen su propia ruta. Y no depende del extremo posterior, ni del extremo frontal. Le pido que preste especial atenci贸n a esto.

Las rutas http no son est谩ticas. Pueden ser muy complicados. Por ejemplo, si se integra un equilibrador en la infraestructura, puede enviar solicitudes recibidas a cualquiera de los nodos posteriores. Al mismo tiempo, el propio backend puede implementar su propia estrategia para trabajar con solicitudes. Algunos de ellos ir谩n directamente a microservicios, otros ser谩n procesados 鈥嬧媝or el propio servidor web, otros ser谩n complementados y transferidos a otra persona, y otros ser谩n emitidos desde el cach茅, etc. As铆 es como funciona Internet. Nada nuevo

Y aqu铆 es importante entender: 驴por qu茅 necesitamos c贸digos de respuesta? La cuesti贸n es que todo el modelo descrito anteriormente toma decisiones basadas en ellos. Es decir Estos son c贸digos que le permiten tomar decisiones de infraestructura y transporte durante el enrutamiento http.

Por ejemplo, si el equilibrador encuentra un c贸digo de respuesta del respaldo 503, al enviar una solicitud, puede tomar esto como base para considerar que el nodo no est谩 disponible temporalmente. Observo que la respuesta con el c贸digo 503 proporciona un encabezado Retry-After. Despu茅s de recibir del encabezado el intervalo para sondeos repetidos, el equilibrador dejar谩 el nodo solo durante el per铆odo especificado y trabajar谩 con los disponibles. Adem谩s, tales estrategias se implementan "fuera de la caja" por los servidores web.

Un peque帽o tema para una comprensi贸n profunda: 驴qu茅 pasa si el nodo responde 500? 驴Qu茅 debe hacer el equilibrador? 驴Cambiar a otro? Y muchos responder谩n, por supuesto, todos los motivos 5xx para deshabilitar un nodo. Y se equivocar谩n. El c贸digo 500 es un c贸digo de error inesperado. Es decir uno que nunca vuelva a suceder. Y lo m谩s importante, cambiar a otro nodo puede no cambiar nada. Es decir simplemente deshabilitamos los nodos sin el menor beneficio.

En el caso de 500, las estad铆sticas nos ayudan. El servidor WEB local del nodo puede traducir el nodo mismo al estado de indisponibilidad con un gran n煤mero de 500 respuestas. En este caso, el equilibrador que contacte a este nodo recibir谩 una respuesta 503 y no lo tocar谩. El resultado es el mismo, pero ahora, esta soluci贸n es significativa y elimina las respuestas "falsas".

Pero eso no es todo. En esta situaci贸n, el monitoreo permitir谩 a los administradores conectarse a la situaci贸n para mantener el nodo. Es decir no solo obtenemos la implementaci贸n de un servicio altamente accesible, con balanceadores, etc., sino tambi茅n un proceso de soporte efectivo.

Y todo esto le permite crear c贸digos de respuesta del servidor. Cualquier arquitectura de aplicaci贸n WEB debe comenzar con el dise帽o de la capa de transporte. Espero que no haya dudas al respecto.

DESCANSO


Har茅 una pregunta ret贸rica: 驴qu茅 es? 驴Y qu茅 le respondiste? No dar茅 enlaces a pruebas obvias, pero lo m谩s probable es que no sea lo que es en realidad :) Esto es solo una ideolog铆a, un estilo. Algunas consideraciones sobre el tema: la mejor manera de comunicarse con la parte posterior. Y no solo comunicarse, sino comunicarse en la infraestructura WEB. Es decir basado en http. Con todas esas "cosas 煤tiles" sobre las que escrib铆 anteriormente. Las decisiones finales para implementar su interfaz son siempre suyas .

驴Alguna vez te has preguntado por qu茅 no se invent贸 un transporte separado para REST? Por ejemplo, para websocket lo es. S铆, tambi茅n comienza con http, pero luego, una vez establecida la conexi贸n, generalmente es una canci贸n separada. 驴Por qu茅 no hacer lo mismo para REST?

La respuesta es simple: 驴por qu茅? Existe un protocolo hermoso, listo y verificado: http. Se escala bien. Le permite implementar servicios complejos y altamente accesibles que pueden hacer frente a una carga pesada. Todo lo que se necesita es introducir algunas reglas conceptuales para que los desarrolladores se entiendan entre s铆.

De aqu铆 se desprende una conclusi贸n simple y obvia: todo lo que es inherente a http es inherente a REST. Estas son entidades inseparables. No hay un encabezado REST separado, ni siquiera una pista de que REST es REST. Para cualquier servidor REST, la solicitud es exactamente la misma que cualquier otra. Es decir REST es justo lo que tenemos en mente.

REST c贸digos de respuesta http


驴Hablemos sobre qu茅 c贸digo debe responder su servidor a una solicitud REST? Personalmente, me parece que de todo lo anterior, la respuesta ya es obvia, porque REST no es diferente de cualquier otra solicitud, debe estar sujeto exactamente a las mismas reglas. El c贸digo de respuesta es una parte integral de REST y debe ser relevante para la esencia de la respuesta. Es decir si el objeto no fue encontrado por solicitud, es 404, si el cliente realiz贸 una solicitud incorrecta 400, etc. Pero, con mayor frecuencia, el debate no termina ah铆. Por lo tanto, continuar茅.

驴Es posible responder todo con el c贸digo 200? 驴Y qui茅n te lo prohibir谩? Por favor ... el c贸digo 200 es el mismo c贸digo que los dem谩s. Es cierto que la base de este enfoque es una tesis muy simple: mi sistema es perfecto, no tiene errores. Si eres una persona que puede crear tales sistemas, 隆esto solo puede ser envidiado!

Pero lo m谩s probable ... no es perfecta. Y los errores suceden. Y sucede que suceden debido a circunstancias m谩s all谩 de nuestro control. Y aqu铆 una soluci贸n t铆pica es crear su propio sistema de codificaci贸n de errores. 驴Eso es malo? Si, eso es malo. Esto es s煤per malo Averig眉emos por qu茅.

Y as铆, tomando el c贸digo 200 como el 煤nico verdadero, nos hacemos responsables del desarrollo de toda la capa (capa cr铆tica) del sistema: manejo de errores. Es decir El trabajo de muchas personas para desarrollar esta capa se env铆a a la chatarra. Y comienza la construcci贸n de su "bicicleta". Pero este mega edificio est谩 condenado al fracaso.

Comencemos con el c贸digo. Si vamos a responder las 200, nosotros mismos tendremos que manejar los errores. El m茅todo cl谩sico es tratar de construir. Cada segmento de c贸digo lo envolvemos con c贸digo adicional. Manejadores que hacen algo 煤til. Por ejemplo, ponen algo en el registro. Algo importante Eso localizar谩 el error. 驴Y si el error surgi贸 no donde se esperaba? 驴O si ocurri贸 un error en el controlador de errores? Es decir Esta estrategia a nivel de c贸digo no funciona a priori. Y al final, el int茅rprete o la plataforma procesar谩 sus errores. SO finalmente. La esencia del error es que no lo est谩s esperando. No necesita ocultarlo, necesita encontrarlo y arreglarlo. Por lo tanto, si REST responde a algunas solicitudes con un error de 500, esto es normal . Y lo que es m谩s, correcto .

Volvamos a la pregunta: 驴por qu茅 es esto correcto? Porque:

  1. Code 500 es un token de infraestructura en funci贸n del cual se puede deshabilitar el nodo en el que se produce el problema;
  2. Los c贸digos 5xx son lo que se est谩 monitoreando y si surge dicho c贸digo, cualquier sistema de monitoreo lo notificar谩 de inmediato. Y el servicio de soporte a tiempo podr谩 conectarse a la soluci贸n del problema;
  3. No escribes c贸digo adicional. No pierdas un tiempo precioso en esto. No compliques la arquitectura. No trata problemas inusuales para usted: escribe el c贸digo de la aplicaci贸n. Lo que quieren de ti. 驴Qu茅 est谩n pagando?
  4. Un rastro que se cae por error 500 ser谩 mucho m谩s 煤til que sus intentos de superarlo.
  5. Si la solicitud REST devuelve el c贸digo 500, el frente que ya est谩 en el momento de procesar la respuesta sabr谩 qu茅 algoritmo debe procesar. Adem谩s, la esencia del asunto no cambiar谩 de ninguna manera, no ha recibido nada sensato ni de 200 ni de 500. Pero de 500 recibi贸 un beneficio: la constataci贸n de que se trata de un error INESPERADO.
  6. El c贸digo 500 vendr谩 con una garant铆a. No importa cu谩n malo o bueno haya escrito su c贸digo. Este es tu punto de apoyo.

Por separado, clavar茅 un clavo en todo el "cuerpo" del c贸digo 200:

7. Incluso si se esfuerza por evitar otros c贸digos de respuesta del servidor que no sean 200 a sus solicitudes, no puede hacer esto. Cualquier servidor intermediario puede responder a su solicitud con absolutamente cualquier c贸digo. Y DEBE procesar dicha respuesta correctamente.

Total, a nivel l贸gico, la lucha por el c贸digo 200 no tiene sentido.

Ahora volvamos al nivel de infraestructura. Muy a menudo escucho la opini贸n: el c贸digo 5xx no es un nivel de aplicaci贸n, no se le puede dar respaldo. Ejem, bueno ... hay una contradicci贸n en la declaraci贸n misma. Puedes dar. Pero este c贸digo no es un nivel de aplicaci贸n. Eso es mas cierto. Para entender esto, propongo considerar el caso:
Est谩s implementando una puerta de enlace. Tiene varios DC, cada uno con su propio canal de comunicaci贸n a un determinado servicio privado. Bueno, por ejemplo, para pagar a trav茅s de VPN. Y hay un canal de comunicaci贸n con Internet. Recibe una solicitud para una operaci贸n con una puerta de enlace, pero ... el servicio no est谩 disponible.
驴Y qu茅 deber铆as responder? A quien? Este es un problema de infraestructura y, espec铆ficamente, la copia de seguridad se top贸 con 茅l. Por supuesto, debe responder con audacia al 503. Estas acciones llevar谩n al hecho de que el equilibrador deshabilitar谩 el nodo durante alg煤n tiempo. Al mismo tiempo, el equilibrador, si est谩 configurado correctamente, sin interrumpir la conexi贸n con el cliente, enviar谩 la solicitud a otro nodo. Y ... el cliente final, con un alto grado de probabilidad, recibi贸 200. Y no una descripci贸n personalizada del error, que no lo ayudar谩 de ninguna manera.

D贸nde y qu茅 c贸digo usar


La pregunta no es simple. No hay una respuesta definitiva para ello. Para cada sistema, se dise帽a una capa de transporte y los c贸digos que contiene pueden ser espec铆ficos.

Hay est谩ndares aceptados. Se pueden encontrar f谩cilmente y, nuevamente, no dar茅 pruebas obvias. Pero, le dar茅 lo que no es obvio: developer.mozilla.org/en/docs/Web/HTTP/Status
Por que el La cuesti贸n es que los manejadores de c贸digo pueden comportarse de manera diferente, dependiendo de la implementaci贸n y el contexto de "comprender el c贸digo". Por ejemplo, los navegadores tienen una estrategia de almacenamiento en cach茅 basada en c贸digos de respuesta. Y algunos servicios tienen sus propios c贸digos personalizados. Por ejemplo, CloudFlare.

Es decir Para tomar decisiones sobre el uso de c贸digos, debe basarse en todos los elementos incluidos en la capa de transporte desde su c贸digo en la parte posterior hasta el c贸digo en el cliente. Esta es la 煤nica forma de encontrar las respuestas correctas. Ni siquiera intentar茅 darles a todos una p铆ldora universal aqu铆.

Ra铆ces del mal


Este es el tercer proyecto al que llego sufre del c贸digo 200 en REST. Es sufrimiento No hay otra palabra Si lees cuidadosamente todo hasta el momento actual, ya entiendes que tan pronto como el proyecto comience a crecer, tiene una necesidad de desarrollo de infraestructura, para su sostenibilidad. El c贸digo 200 mata todos estos intentos de ra铆z. Y lo primero que tienes que hacer es romper los estereotipos.

La ra铆z del mal, me parece, radica en el hecho de que el c贸digo 500 es lo primero que un desarrollador web encuentra en su carrera profesional. Se puede decir una lesi贸n infantil. Y todos sus esfuerzos al principio se redujeron a obtener el c贸digo 200.

Por cierto, por alguna raz贸n, en la misma etapa, se desarrolla una fuerte opini贸n de que solo las respuestas con el c贸digo 200 se pueden suministrar con un cuerpo. Por supuesto, esto no es as铆, y cualquier respuesta puede "venir" con cualquier c贸digo. El c贸digo es un c贸digo. El cuerpo es el cuerpo.

Adem谩s, con el desarrollo del desarrollador, necesita gestionar los errores de su propia aplicaci贸n. Pero ..., 茅l no sabe c贸mo usar los registros. No se puede configurar el servidor web. El esta estudiando. Y esos muy "grandes" nacen. Porque est谩n disponibles para 茅l y 茅l puede hacerlos r谩pidamente. Adem谩s, en este "gran" monta nuevas ruedas, fortalece el cuadro, etc. Y este gran se convierte en su compa帽ero durante un per铆odo de tiempo suficientemente largo, hasta ... hasta que tenga tareas realmente complejas y de m煤ltiples componentes. Y aqu铆, como dicen, est谩 prohibida la entrada al supermercado con el "gran" y el patinaje sobre ruedas.

PD: El autor del art铆culo mencionado lo restaur贸 de los borradores: habr.com/en/post/440382 , para que tambi茅n pueda familiarizarse con 茅l.

PPS: Trat茅 de expresar todas las facetas de la necesidad de usar c贸digos de respuesta relevantes en REST. No responder茅 a los comentarios, por favor, enti茅ndeme correctamente. Los leer茅 con gran atenci贸n, pero no tengo nada que agregar. 隆Muchas gracias por ser lo suficientemente paciente como para leer el art铆culo!

Source: https://habr.com/ru/post/440900/


All Articles