# SQS 101: Separando el problema en partes

Hasta el momento, a lo largo de esta [serie](https://blog.deceroait.com/series/serverless), hemos utilizado una sola Lambda. A medida que nuestro sistema se hace mas grande y va tomando complejidad vamos a querer separar responsabilidades y desacoplar el funcionamiento.

Desde que se han popularizado los micro servicios y  las arquitecturas orientadas a eventos, los sistemas de colas, gestión de mensajes ó colas de eventos, acompañan a la evolución de estos paradigmas. En el ecosistema de AWS una de las herramientas que nos permite este desacople son las colas [SQS](https://aws.amazon.com/es/sqs/).

Que es SQS? Simple Queue Service , por sus siglas en ingles, es un sistema de colas de mensajería completamente administrado por AWS, ha y  es serveless …  

Para dar un dar un vistazo de como podemos utilizarlo, sigamos con el ejemplo de nuestra librería *tesserat*, en entradas anteriores integramos *tesserat*  dentro de la lambda para realizar un OCR sobre una imagen que le pasamos como referencia y al procesar esta imagen, el resultado es dejado en un log de CloudWatch. EL siguiente paso será , dejar este mensaje en una cola SQS y que este mensaje dispare un evento que disparare una lambda de "clasificación" que tomara este mensaje y realizara una acción.

A continuación un diagrama de la solución propuesta:



![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1667845874299/WsC0NqU4s.png align="left")

Para esta prueba trabajamos en la siguiente rama [feature/add-sqs](https://github.com/olcortesb/serverless-aws-ocr-tesseract-demo/tree/feature/add-sqs). 

Primero creamos la cola SQS agregando al *serverless.yml*:

```yml
resources:
  Resources:
    ProcessText:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-process-text
```

Publicamos el proyecto con los cambios, para que se cree el SQS en el entorno de dev de nuestra cuenta de AWS.

```bash
AWS_PROFILE=olcortesb sls deploy --stage dev
```

Verificamos que se la SQS este creado utilizando *AWS-CLI*

```bash
aws sqs list-queues --region us-east-1

```

La respuesta al comando que lista las SQS en una region, tendrá una salida como esta:

```json
{
    "QueueUrls": [
        "https://sqs.us-east-1.amazonaws.com/XXXXXXXXXXXX/dev-process-text"
    ]
}
```

en la misma lambda *Hello* necesitamos escribir el mensaje resultado del procesamiento del ORC esto lo realizamos con la siguiente Linea. (Linea 45 archivos *handler.js*)


```javascript
  await sqsClient.send(new SendMessageCommand(params));

```
Para poder escribir el mensaje en la SQS necesitamos agregar el cliente de AWS al pakage.json.

```bash
npm install @aws-sdk/client-sqs
```

Ahora la segunda parte, en el mismo *serverless.yml* vamos a crear una nueva lambda(*Listen*), esta Lambda tendrá como entrada un evento.

```yml
  listen: 
    handler: handler.listen
    events:
      - sqs:
          arn:
            Fn::GetAtt:
              - ProcessText
              - Arn

```

Agregamos un código simple que lea el mensaje y lo escriba en la consola pero ahora de manera asíncrona desde la lambda listen

```javascript
module.exports.listen = async (event)=>{
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}

```
Ahora solo nos queda invocar la lambda *hello* y esperar que se envíe el mensaje a la SQS y a su ves la lambda *listen* capture el mensaje y lo escriba en el CloudWatch.

_Nota_: Revisar el *serverless.yml* para verificar las variables de entorno necesarias ...

Cualquier dudas o comentarios:

Oscar Cortes

- [Github](https://github.com/olcortesb)
- [Linkedin](https://www.linkedin.com/in/oscarcortesbracho)
- [Twitter](https://twitter.com/olcortesb)


## Referencias
- https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sqs-examples-send-receive-messages.html
- https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html
- https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html
- https://docs.amazonaws.cn/en_us/lambda/latest/dg/with-sqs-create-package.html
