Respuestas:
Una cosa que hice fue crear una alarma CloudWatch activada ApproximateNumberOfMessagesVisible
( >= 1 for 5 minutes
) para la cola SQS. La alarma se publica en un tema de SNS que activa la función lambda. La función lambda se repite hasta que borra la cola.
La alarma puede tardar hasta 5 minutos en activarse, pero funciona fantásticamente para tareas programadas por lotes sin necesidad de sondear la cola. (La granularidad de la alarma es de 5 minutos para las colas activas).
No puedes ir SQS -> SNS
, solo SNS -> SQS
.
Lambda ahora admite la programación, por lo que una opción es implementar un sondeo SQS en una función Lambda y ejecutarlo con frecuencia.
Otra opción a considerar es si realmente necesita una cola. Lambda admite el procesamiento asincrónico (a través del modo de invocación de eventos) y debe escalar horizontalmente de forma transparente para manejar invocaciones paralelas. Si su función lambda no requiere acceso a un almacén de estado central que podría restringir la ejecución paralela, entonces probablemente podría ejecutar todas sus invocaciones en paralelo. Sin embargo, creo que hay un límite de ejecución simultánea de 100 por cuenta, por lo que es posible que deba agrupar sus mensajes para mantenerse por debajo de eso.
SQS
la cola se puede suscribir al SNS
tema y así procesar los SNS
mensajes recibidos . Actualmente, no es factible en otra dirección sin codificación adicional (ver, por ejemplo, Lambda
Preguntas frecuentes ).
Diría que hay un par de opciones para hacerlo, pero no es tan elegante como usar un sistema más común basado en eventos AWS event->SQS->Lambda
. De lo contrario, es posible que deba personalizar / implementar el código de cómo SQS
se procesan las colas:
SQS
colas y luego disparar Lambda
eventos SQSEsto fue preguntado y respondido hace un tiempo, pero habiendo pensado en esto yo mismo, pensé en agregar un enfoque.
Como se mencionó, las fuentes de eventos pueden ser la mejor apuesta aquí. Alternativamente, y no lo he probado ni lo he pensado (así que esto es algo académico), pero puede ser posible lograr esto a través de un patrón Fan-Out con SNS de la siguiente manera:
1. Create a SNS topic.............................: SNS-topic-01
2. Subscribe a SQS queue to that topic............: SQS-queue-01
3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01
Al usar esta configuración, enviar un mensaje al tema SNS lo pondrá en cola en la cola SQS mientras activa simultáneamente una función complementaria de Lambda. Esa función Lambda se escribiría para leer esa misma cola SQS pero con Long Polling habilitado (hasta 20 segundos) para que no lea la cola antes de que se complete la cola (es decir, condición de carrera).
En esencia, este esquema justo a tiempo invoca una función Lambda para cada mensaje SQS en cola. No sé cómo funcionan los lectores de Long Poll simultáneos en SQS (... ¿se cae uno?), Pero esta es solo otra forma de considerar resolver esto. = :)