외부 네트워크 액세스 모범 사례

이 항목에서는 사용자 정의 함수와 프로시저에서 외부 네트워크 위치에 액세스하는 모범 사례를 제공합니다.

외부 함수에서 적용 가능한 모범 사례 따르기

다음을 포함하여 외부 함수 에 대해 설명된 모범 사례를 따르십시오.

외부 함수와 달리, 사용자가 처리기 코드를 통해 재시도 수행, 벡터화된 UDF에서 일괄 요청 보내기, 예외 관리를 해야 합니다.

벡터화된 UDF 또는 UDTF에서 외부 액세스를 사용할 때 한 번에 한 행씩 처리하기

벡터화된 UDF 또는 UDTF 처리기 코드가 외부 네트워크를 요청하는 경우 비결정적 결과를 방지하기 위해 각 행을 독립적으로 처리해야 합니다.

네트워킹 오버헤드를 최소화하기 위해, Snowflake는 일반적으로 원격 서비스로 보낼 행을 일괄 처리합니다. 배치의 수와 각 배치의 크기는 다를 수 있습니다.

또한, 배치의 순서가 다를 수 있으며 배치 내 행의 순서가 다를 수 있습니다. 쿼리에 ORDER BY 절이 포함되어 있더라도 ORDER BY는 보통 외부 함수 위치에 대한 요청 후에 적용됩니다.

배치 크기와 행 순서가 보장되지 않으므로, 이 배치 또는 이전 배치의 다른 행에 따라 달라지는 행의 값을 반환하는 처리기 코드를 작성하면 비결정적 결과가 생성될 수 있습니다.

Snowflake는 코드를 통해 각각의 행을 독립적으로 처리하도록 할 것을 강력히 권장합니다.

각 입력 행의 반환 값은 다른 입력 행이 아니라 해당 입력 행에만 의존해야 합니다. (현재, 예컨대 외부 네트워크 액세스를 수행하는 처리기는 윈도우 함수 를 지원하지 않습니다.)

또한, 배치 크기가 보장되지 않으므로 배치 수를 세는 것은 의미가 없습니다.

가능하면 TCP 연결 재사용하기

Snowflake는 UDF에서 만들 수 있는 총 연결 수를 제한합니다. 이 한도에 도달하면 다음 오류 메시지가 표시될 수 있습니다.

Cannot assign requested address
Copy

리소스 고갈 문제가 발생하지 않도록 하려면 연결을 최대한 많이 재사용해야 합니다. UDF 초기화 중에 TCP 클라이언트 또는 세션을 한 번 만든 다음 나머지 쿼리에 대해 UDF 처리기에서 클라이언트나 세션을 사용하면 최대한 많이 재사용할 수 있습니다. 예를 들어 Python으로 작성된 코드의 경우 여러 HTTP 호출에 대해 Session 오브젝트(Python requests 라이브러리에서 사용 가능)를 재사용할 수 있습니다.

자세한 내용과 예시는 함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오.

코드에서 일시적인 오류 예상 및 처리하기

원격 서비스를 여러 번 호출하는 장기 실행 쿼리가 있는 경우 호출 중 하나가 일시적인 오류로 인해 실패할 수 있습니다. 쿼리 실패를 방지하려면 코드에서 오류가 발생할 수 있다는 가정하에 재시도를 실행하고 오류를 처리해야 합니다.