Práticas recomendadas de acesso à rede externa

Este tópico fornece práticas recomendadas para acessar locais de rede externos a partir de funções e procedimentos definidos pelo usuário.

Siga as práticas recomendadas aplicáveis de funções externas

Siga as práticas recomendadas descritas para funções externas, incluindo o seguinte:

Observe que, diferentemente das funções externas, você é responsável no código do manipulador por realizar novas tentativas, enviar solicitações em lote de UDFs vetorizadas e gerenciar exceções.

Processe uma linha por vez ao usar acesso externo em uma UDF ou UDTF vetorizada.

Quando o código do manipulador de UDF ou UDTF vetorizada faz solicitações de uma rede externa, você deve processar cada linha independentemente para evitar resultados não determinísticos.

Para minimizar a sobrecarga da rede, o Snowflake geralmente envia linhas em lotes para serviços remotos. O número de lotes e o tamanho de cada lote pode variar.

Além disso, a ordem dos lotes pode variar, e a ordem das linhas dentro de um lote pode variar. Mesmo que a consulta contenha uma cláusula ORDER BY, o ORDER BY é normalmente aplicado após a solicitação ao local de rede externo.

Como o tamanho do lote e a ordem das linhas não são garantidos, escrever um código do manipulador que retorna um valor para uma linha que depende de qualquer outra linha nesse lote ou em lotes anteriores pode produzir resultados não determinísticos.

O Snowflake recomenda enfaticamente que seu código processe cada linha de forma independente.

O valor de retorno para cada linha de entrada deve depender apenas daquela linha de entrada, não de outras linhas de entrada. (Atualmente, os manipuladores que realizam acesso à rede externa não suportam funções de janela, por exemplo.)

Observe também que, como o tamanho do lote não é garantido, a contagem dos lotes não é significativa.

Reutilização da conexão TCP, se possível

Snowflake limita o número total de conexões que podem ser feitas a partir de uma UDF. Quando esse limite for atingido, você poderá ver a seguinte mensagem de erro:

Cannot assign requested address
Copy

Para evitar problemas de esgotamento de recursos, você deve tentar reutilizar as conexões tanto quanto possível. Você pode conseguir isso criando o cliente ou a sessão TCP uma vez durante a inicialização da UDF e, em seguida, usando-o no manipulador da UDF para o restante da consulta. Por exemplo, para código escrito em Python, você pode reutilizar o objeto Session (disponível na biblioteca requests do Python) para várias chamadas HTTP.

Para obter mais informações e um exemplo, consulte Uso da integração de acesso externo em uma função ou procedimento.

Espera e tratamento de erros transitórios no código

Quando você tem uma consulta de longa duração que chama o serviço remoto várias vezes, é possível que uma das chamadas falhe com um erro transitório. Para evitar falhas de consulta, seu código deve executar novas tentativas e lidar com falhas presumindo que falhas possam ocorrer.