Acionado por EventGrid, o Python Azure Function continua acionando após ser executado com êxito?

Nov 03 2020

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

1 RomanKiss Nov 04 2020 at 06:54

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.