外部网络访问最佳实践¶
本主题提供从用户定义函数和过程访问外部网络位置的最佳实践。
遵循外部函数中适用的最佳实践¶
遵循针对 :doc:`外部函数 </sql-reference/external-functions>`描述的最佳实践,包括以下内容:
请注意,与外部函数不同,您在处理程序代码中负责执行重试、从矢量化 UDFs 发送批处理请求以及管理异常。
在矢量化 UDF 或 UDTF 中使用外部访问时,一次处理一行¶
当矢量化 UDF 或 UDTF 处理程序代码向外部网络发出请求时,应该独立处理每一行以避免不确定的结果。
为了最大程度地减少网络开销,Snowflake 通常会按批次处理要发送到远程服务的行。批次数和每个批次的大小可能会有所不同。
此外,批次的顺序可能不同,批次中的行的顺序也可能不同。即使查询包含 ORDER BY 子句, ORDER BY 通常也在向外部网络位置发出请求后应用。
由于无法保证批次大小和行顺序,因此编写依赖该批次或以前批次中的任何其他行来返回值的处理程序代码可能会产生不确定的结果。
Snowflake 强烈建议代码独立处理每一行。
每个输入行的返回值应仅依赖于该输入行,而不依赖于其他输入行。(例如,目前执行外部网络访问的处理程序不支持 窗口函数。)
另请注意,由于无法保证批次大小,因此对批次进行计数没有意义。
如果可能,请重复使用 TCP 连接¶
Snowflake 限制了 UDF 可以建立的连接总数。达到此限制时,可能会看到以下错误消息:
Cannot assign requested address
为避免遇到资源耗尽问题,应尝试尽可能多地重用连接。可以通过在 UDF 初始化期间创建一次 TCP 客户端或会话来实现这一点,然后在 UDF 处理程序中为其余的查询使用它。例如,对于用 Python 编写的代码,可以在多个 HTTP 调用中重用 Session
对象(可从 Python requests
库中获得)。
有关详细信息和示例,请参阅 在函数或过程中使用外部访问集成。
预期并处理代码中的暂时性错误¶
如果长时间运行的查询多次调用远程服务,则其中一个调用可能会失败,并出现暂时性错误。要避免查询失败,代码应执行重试并处理失败,前提是可能会发生失败。