Cómo IPF Maneja la Realidad

Introducción

Posiblemente, la definición de sistemas distribuidos más citada fue convenientemente proporcionada por uno de los fundadores del campo:

Un sistema distribuido es aquel en el que la falla de una computadora que usted ni siquiera sabía que existía puede hacer que su propia computadora sea inutilizable.
— Leslie Lamport

Desafortunadamente, esa definición sigue vigente — la computación distribuida es un campo muy complejo que a menudo conduce a malentendidos y suposiciones erróneas.

Las ahora legendarias falacias que L. Peter Deutsch y otros en Sun Microsystems identificaron siguen siendo prevalentes y pueden llevar a problemas significativos si no se abordan adecuadamente. Este documento presenta las falacias y explica cómo puede intentar no ser víctima de ellas al utilizar el SDK de IPF.

Las falacias de la computación distribuida

  1. La red es confiable.

  2. La latencia es cero.

  3. El ancho de banda es infinito.

  4. La red es segura.

  5. La topología no cambia.

  6. Hay un administrador.

  7. El costo de transporte es cero.

  8. La red es homogénea.

Abordando las falacias con IPF SDK

1. La Red es Confiable

Las aplicaciones de software a veces se escriben con poca o ninguna consideración de los errores de red. Durante una red outage, tales aplicaciones pueden detenerse o esperar indefinidamente un paquete de respuesta, consumiendo permanentemente memoria u otros recursos. Cuando el failed cuando la red esté disponible, esas aplicaciones también pueden fallar al reintentar cualquier operación detenida o requerir un (manual)restart.

El Enfoque IPF

IPF utiliza Akka y como su documentación oficial estados, al emular Erlang,Akka hace explícita la falibilidad de la comunicación a través del paso de mensajes, por lo tanto, no intenta mentir y emular una abstracción con fugas, y el SDK de IPF ha adoptado esta filosofía con seriedad.

Al comunicarse con flujos construidos por IPF DSL Los desarrolladores de IPF deben considerar siempre las fallas de red. El código generado por IPF DSL proporciona reintentos configurables y controles de idempotencia por defecto, proporcionando a los desarrolladores los mecanismos para construir semánticas de entrega exactamente una vez cuando se trata de entradas de flujo.

Además, IPF DSL permite transiciones de flujo en timeouts, promoviendo así la gestión de tiempo de espera como un ciudadano de primera clase — más a menudo de lo que se podría pensar, qué hacer en caso de timeouts causado por la falta de respuesta de un sistema externo es un negocio decision y no uno técnico. Al configurar tiempos de espera los desarrolladores pueden crear diversas políticas de tiempo de espera y, por lo tanto, garantizar que se cumplan las demandas comerciales cuando se enfrentan a problemas de red.

Dado que en una aplicación típica de orquestación de IPF los flujos se integran estrechamente con Marco de Conectores IPF, aprovechando reintentos y timeouts en ambos enviar y receive connector s puede ayudarle a lidiar con interrupciones temporales de la red, mientras que para interrupciones más prolongadas, una estrategia de reintento basada en mensajes enviados a un apéndice de carta muerta puede ser más aplicable.

Akka Cluster también viene empaquetado con soporte integrado para particiones de red (y fallos de máquina, que se tratan de la misma manera que los inalcanzables a través de la red):

  • Akka El [Detector de Fallos monitorea la salud de los nodos remotos y detecta fallos utilizando el algoritmo de detección de acumulación phi, permitiendo que el sistema responda adecuadamente. El detector de fallos utiliza mensajes de latido para verificar la disponibilidad de los nodos.

  • Si un nodo no responde a los latidos dentro de un cierto período de tiempo, se marca como inalcanzable y Akka Resolutor de Cerebros Divididos toma las acciones apropiadas, como apagar los nodos en el lado minoritario de la partición, redirigiendo así los mensajes o redistribuyendo las tareas a los nodos restantes.

Finalmente, debe aplicar las mismas prácticas de desarrollo a sus flujos que utilizaría con sus funciones: prefiera flujos de orquestación más cortos que realicen una sola tarea de manera efectiva. Flujos complejos — flujos que consisten en muchos estados y generan mucha domain events a lo largo de su vida — a menudo tardan más en recuperarse cuando Akka los distribuye a nuevos nodos. Una buena regla general sería apuntar a flujos con no más de 20 estados — por ejemplo, si realiza una verificación de sanciones en su payment flow consiste en 8 estados, considere extraer esa lógica en un flujo propio, especialmente si es algo que puede ser reutilizado por otros flujos.

 Con todas las opciones de configuración de reintentos y tiempos de espera disponibles en diferentes niveles, se vuelve fácil crear una configuración que cause más daño que beneficio.
Como regla general, usted debe:
  • comience con no timeouts en sus conectores de recepción

  • asegure un sending connector El tiempo de espera del intento de 's' es suficientemente más corto que su tiempo de espera de llamada si desea que el conector realice algún reintento.

  • asegure lo apropiado sending connector El tiempo de espera de la llamada es más corto que el intervalo de reintento de acción más pequeño; de lo contrario, el flujo puede renunciar a un intento demasiado pronto y causar que su aplicación genere demasiadas solicitudes posteriores.

2. La latencia es cero

Los desarrolladores a menudo escriben software que asume que la comunicación en red ocurre de manera instantánea, sin demora. En realidad, la latencia siempre está presente debido al tiempo que tarda en viajar la información a través de la red, influenciada por factores como la distancia, la congestión de la red y el tiempo de procesamiento de los dispositivos intermedios y los sistemas externos de destino. Esto puede llevar a cuellos de botella en el rendimiento cuando el sistema se despliega en un entorno distribuido — las aplicaciones pueden retener recursos críticos del sistema como hilos mientras esperan que las operaciones se completen, o iniciar más trabajo del que se puede completar en un cierto período de tiempo, consumiendo cada vez más recursos del sistema hasta que todos los recursos disponibles se agoten y la aplicación se detenga o eventually fallos.

El Enfoque IPF

El marco de conectores IPF se basa en Akka Streams que — similar a otros Flujos Reactivos implementaciones — proporcione mecanismos de contrapresión para manejar latencias variables y asegurar un flujo de datos fluido. Akka Streams permite la definición de pipelines de procesamiento de datos que pueden adaptarse a la velocidad del componente más lento. Esto previene la sobrecarga de cualquier parte del sistema y asegura que los datos se procesen de manera eficiente, incluso en presencia de latencia de red.

Además, ambos Akka y el SDK de IPF se ha construido en torno a operaciones no bloqueantes, asegurando que no se desperdicien recursos del sistema esperando a que se completen las operaciones de E/S, sino que se utilicen para procesar el trabajo pendiente.

Viendo que rara vez es el caso que las operaciones comerciales deseen esperar indefinidamente a que una operación se complete, al considerar la latencia en sus soluciones, debe aplicar el mismo pensamiento de reintento y tiempo de espera ya expuesto en La red es confiable..

Finalmente, a menudo la mejor manera de lidiar con la latencia de la red es no utilizar la red en absoluto --caching El uso frecuente de datos localmente en lugar de realizar llamadas remotas repetidas suele ser una excelente manera de reducir el impacto de la latencia en su aplicación. IPF proporciona su propio en memoria caching biblioteca pero no le impide utilizar ningún otro caching tecnología que usted puede preferir. Tenga cuidado con el viejo dicho, sin embargo:

Solo hay dos cosas difíciles en la Ciencia de la Computación:cache invalidación y nombrar cosas.
— Phil Karlton
IPF viene con soporte integrado para telemetría, de la cual los más fáciles de usar son los Akka, aplicación y conector métricas, todas las cuales incluyen latencias de diferentes partes del sistema.

3. El ancho de banda es infinito

Los desarrolladores de software a menudo permiten que el tráfico sin límites fluya hacia y desde sus aplicaciones con poco o ningún respeto por los límites de ancho de banda, causando en el peor de los casos congestión que añade latencia a la red, potencialmente incluso desperdiciando ancho de banda al aumentar los paquetes perdidos debido a desbordamientos de búfer.

El Enfoque IPF

Muy similar a La latencia es cero, el existente mecanismos de contrapresión permitirá que las soluciones del SDK de IPF se desaceleren cuando la latencia aumente debido a que el ancho de banda empuja la red al límite. Pero el SDK de IPF también ofrece enfoques proactivos para controlar el ancho de banda antes de que comience a causar problemas:

  • Send connector interruptores automáticos puede ser utilizado para desviar proactivamente el tráfico a sistemas posteriores — una vez que la latencia supere el tiempo de espera configurado del conector, los interruptores de circuito fallarán rápidamente y omitirán la transmisión de cualquier cosa a través de la red.

  • Limitación de mensajes en ambos los conectores de envío y recepción le permite establecer límites arbitrarios sobre la cantidad de mensajes que está dispuesto a enviar o recibir dentro de un intervalo de tiempo determinado, aplicando presión inversa cuando se superan los límites.

  • Etapas de conversión del conector IPF le permite utilizar cualquier protocolo de serialización/deserialización que se ajuste a sus necesidades y elegir un protocolo más eficiente que el que está utilizando actualmente puede ayudar a reducir parte del ancho de banda. Las opciones populares incluyen CBOR, Avro, Protocol Buffers y Ion, pero incluso pasar a un binario JSON representación como Sonrisa puede generar resultados.

  • Revise sus flujos y encuentre oportunidades para reducir la cantidad de datos incluidos en domain events:

    • Asegúrese de que no haya redundancia de datos en el domain events a sí mismos, por ejemplo, no declare un business data elemento en el domain event si su valor realmente no cambia.

    • Solo declare business data elementos que sus flujos están utilizando activamente, por ejemplo, no intente incluir datos con fines de auditoría, ya que esa es una preocupación que generalmente se maneja fuera de los flujos de orquestación mismos.

  • Habilitando la compresión a diferentes niveles.

    • Al persistir IPF DSL domain events o al comunicarse con diferentes Akka actores (incluyendo flujos IPF DSL), Serialización de Akka se utiliza para serializar datos antes del transporte y algunos de los serializadores disponibles, como el predeterminado de IPF Jackson Serializer, oferta compresión capacidades.

    • MongoDB, Kafka así como muchos Java HTTP Los servidores admiten la compresión a nivel de transporte que puede habilitar para reducir el tamaño de las cargas útiles intercambiadas a través de la red.

  • Aprovechando caching. Como se mencionó en la sección anterior, IPF viene con su propio en memoria caching biblioteca pero puede utilizar el suyo. Para ayudar a reducir el ancho de banda general, sin embargo, puede aplicar caching fuera de IPF también — equilibradores de carga y mallas de servicios oferta caching soporte, como lo hacen CDNs.

  • Re-arquitecte algunos de los componentes en su aplicación para que sean local-primero. Como se describe en otros lugares, IPF SDK se basa en event sourcing por lo que es posible suscribirse a la domain events emitido por los flujos y construya su (eventually vistas materializadas y proyecciones locales consistentes.

    Si bien el enfoque local-prioritario puede ser adoptado para mejorar la resiliencia y disponibilidad de su aplicación, si lo está adoptando únicamente por las mejoras en el ancho de banda, debe asegurarse de que la cantidad de datos que necesita leer de los servicios externos sea mayor que el event datos a los que se está suscribiendo — de lo contrario, al optar por lo local primero, puede terminar aumentando el ancho de banda.
    Asegúrese de incluir métricas de red detalladas cuando esté configurando la observabilidad de su IPF application despliegues.

4. La Red es Segura

A menos que la seguridad sea una de las principales características de venta del sistema desarrollado, la seguridad a menudo se considera un aspecto secundario en la mayoría de los ciclos de desarrollo de software, lo que con frecuencia conduce a vulnerabilidades.

El Enfoque IPF

Suponer que la red es segura a menudo conduce a descuidar la encriptación de los datos en tránsito, ya que sin encriptación, la información sensible puede ser interceptada por actores maliciosos. Mientras que una aplicación típica construida con IPF SDK generalmente no estará ejecutándose dentro de un DMZ, todavía hay personas preocupadas por la seguridad decisions que usted podría estar realizando para reducir los riesgos de seguridad.

Akka Remoting -- el Akka componente utilizado por Akka Cluster internamente y por IPF para comunicarse con los flujos del SDK de IPF --https://doc.akka.io/docs/akka/current/remote-security.html#configuring-ssl-tls-for-akka-remoting[soporta la encriptación a nivel de transporte], con un beneficio adicional de apoyar https://doc.akka.io/docs/akka/current/remote-security.html#mtls-with-rotated-certificates-in-kubernetes[mTLS a través de certificados rotados con frecuencia] cuando se ejecuta en Kubernetes.

Además de soportar la encriptación a nivel de transporte en Akka, IPF SDK también le permite añadir cifrado a nivel de transporte a otros componentes:

Finalmente, si los consumidores objetivo lo apoyan, IPF Connectors permite enviar y consumir cargas útiles cifradas a través de etapas de cifrado. Uso de cargas útiles cifradas con JMS y Kafka también asegura que los datos estén cifrados en rest.

Incluir pruebas de seguridad y penetración en su pipeline de CD es una buena idea, pero siempre consulte a expertos en seguridad (internos o externos) para realizar periódicamente una auditoría de seguridad adecuada — ¡podría evitarle hacer titulares de manera negativa!

5. La topología no cambia

Con la virtualización generalizada de máquinas servidoras y la contenedorización de aplicaciones,https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/[Mascotas vs Ganado] La analogía comienza a favorecer en gran medida el enfoque del ganado, lo que significa que las máquinas o instancias de una aplicación que se inician, se detienen y desaparecen son un hecho cotidiano. Los sistemas mal diseñados que no contemplan la redundancia y la tolerancia a fallos son más vulnerables a los cambios en la topología de la red y de las máquinas. Si un solo nodo o enlace falla, todo el sistema puede detenerse por completo.

El Enfoque IPF

Como se mencionó anteriormente, IPF SDK se basa en Akka Cluster y sus complementos para bootstrap el clúster de servicios y luego adaptarse dinámicamente a los cambios en la red y la topología de la máquina, asegurando disponibilidad continua y escalabilidad. Akka Cluster y su descubrimiento mecanismos (incluyendo los de propiedad de IPF Descubrimiento basado en MongoDB) puede detectar automáticamente cuando los nodos se unen o abandonan el clúster y redistribuir datos y tareas en consecuencia. Esto asegura que el sistema permanezca operativo incluso a medida que la topología de la red cambia.

Mientras que los componentes mencionados cubren cambios de topología elegantes, al tratar con cambios no elegantes — es decir, fallos y caídas — la pérdida de mensajes, la falta de respuesta o el aumento de la latencia son síntomas comunes, por lo que se manejan de manera similar a lo descrito en La red es confiable. y La latencia es cero.

Además, dado que el SDK de IPF tiene como objetivo apoyar la escritura de aplicaciones nativas de la nube por diseño, ofrece algunas herramientas para ayudarle al desplegar en la nube:

  • HTTP APIs para verificaciones de salud, vitalidad y preparación a través del Spring Boot Actuador y Gestión de Akka HTTP puntos finales que pueden ser utilizados por las diversas plataformas para saber cuándo iniciar de manera segura el enrutamiento del tráfico a su instancia de aplicación o cuándo eliminar o restart una instancia que no responde o que ha fallado.

  • Connector Operations API para permitirle construir automatización en torno al inicio y la detención de la recepción de tráfico.

  • Soporte para actualizaciones en línea para permitirle evitar el tiempo de inactividad al implementar nuevas versiones de sus aplicaciones.

6. Hay un Administrador

Particularmente frecuente cuando hay una falta de comunicación entre los equipos de infraestructura y desarrollo, la suposición de los equipos de desarrollo de que existe un único administrador donde todo el conocimiento está centralizado y es consistente puede llevar a fallos inesperados cuando ocurren conflictos y configuraciones incorrectas.

El Enfoque IPF

A diferencia de las falacias anteriores, el SDK de IPF desempeña únicamente un papel de apoyo para ayudarle a superar los problemas presentados por esta, siendo las herramientas y prácticas de observabilidad y monitoreo las que desempeñan el papel principal. Como se mencionó en La topología no cambia y La latencia es cero, IPF viene con un amplio soporte de observabilidad, así como con características amigables para la automatización y nativas de la nube. HTTP puntos finales. Estos no solo le permiten hacer un seguimiento de sus SLA y KPI, sino que también pueden ser utilizados por herramientas de alerta y monitoreo para ayudarle a añadir una automatización robusta en CI/CD tuberías. Cuando su CI/CD incluye todas sus aplicaciones y también abarca infraestructura, se vuelve posible realizar retrocesos automáticos de cambios disruptivos. Incluso sin automatización, el IPF y Akka la telemetría debe permitirle crear reglas de alerta y operational dashboard s que pueden ayudar a identificar problemas.

Como parte de sus prácticas operativas, debe esforzarse por automatizar todo lo que se pueda automatizar. Para las áreas que no pueden ser, construya buenos sistemas de alertas y paneles de control para que sus operadores tengan una forma más sencilla de identificar problemas.

7. El costo de transporte es cero

Ya sea que esté construyendo y gestionando sus propios centros de datos o utilizando uno de los proveedores de la nube, siempre hay un costo asociado con la comunicación de red. Desde una perspectiva de software, ese costo se paga por la sobrecarga computacional y la latencia de las llamadas remotas, pero desde una perspectiva operativa, el costo también es financiero. Olvidar este factor de costo durante el diseño y desarrollo de su aplicación puede convertir una gran idea de mejora empresarial en un enorme pozo de dinero.

El Enfoque IPF

Su enfoque aquí debe ser en reducir el número de llamadas a la red, el tamaño de las cargas útiles enviadas a través del cable y también en mejorar la localidad de los datos. Si todo eso le suena familiar, ¡ha estado prestando atención! El enfoque adoptado aquí es cómo El ancho de banda es infinito. se maneja.

La única diferencia entre los enfoques es lo que usted rastrea en sus herramientas de monitoreo e informes; usted querrá identificar las métricas que se correlacionan con sus costos y utilizarlas primero para guiar sus optimizaciones y luego para mantener un control cuidadoso sobre el presupuesto. Para implementaciones en la nube, puede que desee centrarse en una infraestructura de red dedicada como las puertas de enlace NAT y la comunicación entre centros de datos, ya que estas suelen generar costos significativos de transferencia de datos.

8. La Red es Homogénea

Los desarrolladores frecuentemente asumen que todas las partes de una red son uniformes en términos de rendimiento, fiabilidad y configuración, lo cual puede estar en marcado contraste con la realidad, incluso cuando se trata de redes locales pequeñas a medianas, y mucho más en el caso de las enormes redes privadas gestionadas por diversos proveedores de nube.

El Enfoque IPF

Esta falacia fue una adición tardía a la lista por James Gosling y, de alguna manera, une todas las falacias anteriores. La realidad es que las redes pueden incluir una mezcla de diferentes hardware, software, protocolos, configuraciones y costos asociados, y todos estos pueden cambiar en cualquier momento durante la vida útil de su aplicación.

Por lo tanto, las aplicaciones que usted construya deben ser capaces de manejar particiones de red or destinos volviéndose inalcanzables, cambiando latencias y congestiones repentinas, o los requisitos de seguridad se están volviendo más estrictos de la noche a la mañana.

Conclusión

El SDK de IPF, con su dependencia de varios Akka módulos, proporciona una solución moderna y completa a las realidades que conllevan trabajar con arquitecturas modernas. Al aprovechar estas tecnologías, los desarrolladores pueden construir más fácilmente sistemas distribuidos robustos, escalables y confiables que aborden los desafíos inherentes a la computación distribuida.

Como se ha mencionado varias veces a lo largo de este documento, IPF SDK no fue diseñado para funcionar de manera aislada — facilita la construcción 12-factor y nativo de la nube Las aplicaciones son más fáciles de usar y para aprovechar al máximo, debe estar completamente integrada en su ecosistema operativo existente e incluida en las herramientas de alerta y monitoreo relevantes que usted utiliza.