No estoy seguro de entender correctamente los desencadenadores de AWS Lambda - SQS. ¿Puedo configurarlo de tal manera que una cola SQS pueda activar diferentes funciones lambda según el cuerpo del mensaje o un atributo del mensaje?
Mi caso de uso: tengo tres funciones lambda diferentes (processCricket, processFootball, processTennis), cada una de las cuales realiza una función única. Tengo una sola cola (processGame) que recibe mensajes. Cada mensaje en la cola tiene un atributo "tipo" que es "Cricket", "Fútbol" o "Tenis". ¿Puedo invocar una función lambda diferente según el "tipo" del mensaje?
Opción 1: configurar SQS para activar una función lambda diferente según el tipo (no estoy seguro de poder hacer esto)
Opción 2: configurar una función lambda que pueda verificar el tipo y luego llamar a las otras funciones lambda según su tipo
Opción 3: Cree colas separadas para cada lambda. Controle qué lambda procesa el mensaje agregando el mensaje a la cola adecuada.
Opción 1: configurar SQS para activar una función lambda diferente según el tipo
No puede saber sobre el type hasta que sea consumido por la lambda. Así que este no es posible.
Opción 2: configurar una función lambda que pueda verificar el tipo y luego llamar a las otras funciones lambda según su tipo
Sí, es la forma "posible" de primera opción. pero puede costar "más" dependiendo de su uso. Cuando consume los sqs en modo por lotes, debe invocar varias lambdas realizando varias comprobaciones.
Opción 3: Cree colas separadas para cada lambda. Controle qué lambda procesa el mensaje agregando el mensaje a la cola adecuada.
En mi opinión, esta podría ser la mejor opción. Puede configurar diferentes DLQ para cada cola, establecer diferentes tamaños de lote según sus reglas comerciales, sin necesidad de lambda adicional para aumentar la "complejidad".
No debe configurar varias funciones de Lambda como disparadores para una sola cola de SQS. Esto se debe a que el mensaje en SQS se entregará a cualquier consumidor y, mientras ese consumidor procesa este mensaje, no será visible para los demás. Por lo tanto, no podrá decidir qué "tipo" de mensaje va a qué función, por lo que la opción 1 no es válida.
Tanto la opción 2 como la 3 deberían funcionar bien. Seleccionaría la opción 2 si no espera que se entreguen muchos mensajes a su cola, por lo que no tendrá que preocuparse por el escalado de Lambda . También tenga en cuenta que se pueden enviar varios mensajes en un solo lote al disparador de Lambda, por lo que deberá implementar su lógica en consecuencia.
Si espera una gran cantidad de mensajes, la opción 3 sería más adecuada.
Su mejor opción aquí sería no enviar los mensajes directamente a la cola. Puede utilizar SNS o EventBridge como destino del mensaje. Entonces deberías tener una cola para cada tipo de mensaje. Luego puede suscribir cada cola a la fuente (SNS o EventBridge) y recibir solo los mensajes que tengan sentido para esa cola. Con EventBridge puede realizar una buena cantidad de filtrado en toda la carga útil. Para SNS, debe agregar el tipo a los atributos para que pueda usarse para filtrar.