En la era digital, la velocidad y la eficiencia son clave para el éxito empresarial. La capacidad de manejar grandes volúmenes de datos y procesarlos rápidamente es fundamental para mantenerse competitivo en un mercado en constante evolución. Aquí es donde entran en juego las funciones Lambda de AWS, que ofrecen una forma ágil y escalable de ejecutar código sin preocuparse por la gestión de servidores subyacentes.
Las funciones Lambda permiten ejecutar código en respuesta a eventos específicos, eliminando la necesidad de mantener servidores en funcionamiento continuo. Esto se traduce en una arquitectura más ágil y económica, donde solo se paga por el tiempo de ejecución efectivo. Sin embargo, para aplicaciones complejas que manejan flujos de trabajo intensivos en datos, es fundamental orquestar estas funciones con otros servicios de AWS para garantizar una ejecución fluida y eficiente.
En esta oportunidad, les contaré cómo se aplicó en un proyecto la integración de lambda con SNS y SQS.
Para empezar, la arquitectura propuesta fue asíncrona, donde un API Gateway se integraba con una función lambda. Dicha lambda le respondía al usuario con un JSON con cierto formato, mientras se encargaba de enviar un mensaje a un tópico SNS, y además de persistir en una base de datos la transacción con su estado inicial.
La lambda se desarrolló en Python y parte del código de la integración con el tópico se puede resumir en el siguiente fragmento:
import boto3
import json
def lambda_handler(event, context):
sns = boto3.client('sns')
topic_arn = secrets['TOPIC_ARN']
try:
response = sns.publish(
TopicArn=topic_arn,
Message=json.dumps(event),
MessageGroupId='1', # Debe ser un identificador único para el grupo de mensajes
MessageDeduplicationId=eventId
)
except sns.exceptions.ClientError as e:
print("Ocurrió un error: ", e)
Sin entrar en mucho detalle, estamos publicando en el tópico el evento que llega a la función, en formato JSON.
Ampliando un poco la arquitectura, aparecen las colas SQS, que se suscriben al tópico. Para diferenciar a qué SQS enviar el mensaje, se aplicaron unos filtros por medio de políticas en donde, dependiendo del contenido del mensaje, se enviará a una cola en particular.
Por ejemplo, esta política:
{
"path": [
"/v1/myAPI"
],
"country": [
"ARG"
]
}
Todo mensaje que llegue al tópico, que tenga ese path y ese código de país, se va a enviar a una cola, quedando el diagrama de arquitectura de esta manera:
En resumen, vimos cómo la función lambda se integra con un tópico SNS, y cómo distintas colas SQS se suscriben a ese tópico, con ciertos filtros.
Por último, podemos destacar ciertas ventajas y desventajas de esta arquitectura.
Ventajas:
- Esta arquitectura es característicamente de bajo acoplamiento, ya que la comunicación entre componentes es básicamente asincrónica.
- La comunicación entre los componentes es reactiva, rápida y desacoplada.
- Los distintos servicios que emiten o consumen eventos pueden escalar independientemente unos de otros otorgando más flexibilidad. Esto hace que sea una arquitectura muy simple para escalar.
Desventajas:
- Testing y debugging: realizar comprobaciones en una arquitectura orientada a eventos en la totalidad de sus componentes, incluyendo también la comunicación entre ellos, incrementa la complejidad de las tareas y la estrategia de testing.
- Organización: dada la naturaleza desacoplada de sus componentes, es muy importante mantener una organización detallada de los eventos, emisores y receptores de los mismos. Debe evitarse la duplicidad de eventos.
Al aprovechar estas tecnologías de manera inteligente, las empresas pueden procesar grandes volúmenes de datos de manera rápida y confiable, manteniendo al mismo tiempo costos bajo control y garantizando la seguridad de sus sistemas. En un mundo donde la velocidad y la eficiencia son requisitos indispensables en el ámbito comercial, esta integración ofrece una ventaja competitiva significativa para aquellos que buscan innovar y crecer en el mercado digital.