Respostas:
Uma coisa que fiz foi criar um alarme do CloudWatch ativado ApproximateNumberOfMessagesVisible
( >= 1 for 5 minutes
) para a fila SQS. O alarme é publicado em um tópico do SNS que aciona a função lambda. A função lambda faz um loop até limpar a fila.
Pode levar até 5 minutos para disparar a partir do alarme, mas funciona de maneira fantástica para tarefas agendadas em lote sem a necessidade de pesquisar a fila. (A granularidade do alarme é de 5 minutos para filas ativas.)
Você não pode ir SQS -> SNS
, apenas SNS -> SQS
.
O Lambda agora suporta agendamento, portanto, uma opção é implementar um pesquisador SQS em uma função Lambda e executá-lo com freqüência.
Outra opção a considerar é se você realmente precisa de uma fila. O Lambda suporta processamento assíncrono (por meio do modo de chamada de evento) e deve ser escalado horizontalmente de forma transparente para lidar com chamadas paralelas. Se sua função lambda não requer acesso a um armazenamento de estado central que pode restringir a execução paralela, provavelmente você pode executar todas as suas chamadas em paralelo. Porém, acredito que há um limite de execução simultânea de 100 contas por conta; portanto, você pode precisar agrupar suas mensagens para permanecer abaixo disso.
SQS
A fila pode ser inscrita no SNS
tópico e, assim, processar as SNS
mensagens recebidas . Atualmente, não é possível em outra direção sem codificação adicional (consulte, por exemplo, Lambda
FAQ ).
Eu diria que existem algumas opções de como fazê-lo, mas não é tão elegante quanto o uso de sistemas orientados a eventos mais comuns AWS event->SQS->Lambda
. Caso contrário, pode ser necessário customizar / implementar o código de como as SQS
filas são processadas:
SQS
filas e, em seguida, acionar Lambda
eventos SQSIsso foi perguntado e respondido há um tempo atrás, mas tendo acabado de pensar nisso, pensei em adicionar uma abordagem.
Como mencionado, as fontes de eventos podem ser a melhor aposta aqui. Como alternativa, e eu não testei isso nem pensei nisso (portanto, isso é meio acadêmico), mas pode ser possível fazer isso por meio de um padrão Fan-Out com o SNS da seguinte maneira:
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
Usando essa configuração, o envio de uma mensagem para o tópico do SNS enfileirará-a na fila do SQS enquanto aciona simultaneamente uma função complementar do Lambda. Essa função Lambda seria gravada para ler a mesma fila SQS, mas com a Pesquisa longa ativada (até 20 segundos) para que ela não leia a fila antes que o enfileiramento seja concluído (ou seja, condição de corrida).
Em essência, esse esquema just-in-time invoca uma função Lambda para cada mensagem SQS enfileirada. Não sei como os leitores simultâneos da Long Poll funcionam no SQS (... alguém é descartado?), Mas essa é apenas outra maneira de considerar a solução. = :)