Acionado por EventGrid, o Python Azure Function continua acionando após ser executado com êxito?
Existem alguns outros tópicos por aí, mas nenhum com soluções ou nenhum pertencente a funções Python.
Fundo:
- Acionado por EventGrid, Python Azure Function
- Mensagens EventGrid criadas apenas quando um blob é carregado para uma determinada conta de armazenamento
- A função recebe a mensagem, baixa o blob do URL da mensagem e faz "coisas"
- A função pode ser executada por vários segundos / minutos (até 120 segundos para blobs grandes)
Exemplo de problema:
- 4 arquivos carregados para o recipiente de blob na conta de armazenamento correta
- Função disparada com sucesso 4 vezes, por 4 mensagens EventGrid separadas
- A função baixa o blob do URL em cada mensagem, faz "coisas"
- ~ 55 segundos depois, mais 4 mensagens EventGrid acionam a função novamente (para os mesmos 4 arquivos!)
- Tudo se repete
Isso acontece várias vezes, resultando em 12 execuções de função para 4 arquivos:
- E a saída correspondente das "coisas" que a Função faz!
Fica ridículo quando 2500 arquivos são carregados para a conta de armazenamento!
Parece que preciso ajustar o tempo de repetição do EventGrid. Mas não vejo uma configuração para isso no Portal:
Como posso evitar esse comportamento?
EDIT 1: Então, hoje ... nenhum problema com 16 arquivos enviados ... por que esta função está sendo disparada de forma inconsistente pelo EventGrid?
EDIT 2: E novamente hoje ... sem motivo, ~ uma hora depois ... EventGrid disparou um monte de gatilhos mais embora NENHUM ARQUIVO tenha sido carregado para a conta de armazenamento.
Aqui estão as estatísticas do EventGrid para 16 arquivos sendo carregados para a conta de armazenamento.
- Você pode ver claramente que os números estão por toda parte com, em alguns casos, cerca de 1 hora entre as tentativas.
- Parece bastante arbitrário para mim
EDIT 3: Para qualquer pessoa interessada ...
- O que parece estar acontecendo é: EventGrid está sendo acionado por DOIS eventos na conta de armazenamento para um ÚNICO upload de arquivo.
- Isso está gerando dois esquemas EventGrid (um para um "evento Microsoft.Storage.BlobCreated" e um para "evento Microsoft.Storage.BlobCreated (Data Lake Storage Gen2)"
- Como o
data.urlparâmetro da mensagem EventGrid é diferente (xxx.blob.core.windows.netvs.xxx.dfs.core.windows.net), minha função está falhando (pois usaBlobClient.from_blob_url - Mais por vir.
Respostas
Com base no documento , o assinante (como sua função EventGridTrigger) precisa enviar uma resposta de volta ao AEG dentro de 30 segundos, caso contrário, a mensagem é enfileirada para nova tentativa.
Observe que o evento é removido da fila de novas tentativas quando o AEG recebe uma resposta bem-sucedida dentro de 3 minutos do terminal de destino de entrega (assinante). Se o recurso de deadlettering estiver ativado, o evento será removido da fila de repetição também quando o código de falha de resposta for 400 ou 413.
Com base no acima exposto e no seu assinante de longa data, a AEG enviou um evento duplicado em 3 minutos.
Eu recomendo usar um padrão Push-Pull em sua solução, como entrega de um evento para a fila de armazenamento.