在 apache beam 中调用外部 API 的更好方法

Better approach to call external API in apache beam

我有 2 种方法来初始化 HttpClient 以便从 Apache Beam 中的 ParDo 进行 API 调用。

方法一:

初始化StartBundle中的HttpClient对象并关闭FinishBundle中的HttpClient。代码如下:

public class ProcessNewIncomingRequest extends DoFn<String, KV<String, String>> {
        
        @StartBundle
        public void startBundle() {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                                       .uri(URI.create(<Custom_URL>))
                                       .build();

        }
        
        @ProcessElement
        public void processElement(){
            // Use the client and do an external API call
        }

        @FinishBundle
        public void finishBundle(){
             httpClient.close();
        }
}

方法二:

有一个单独的 Class,其中所有连接都使用连接池进行管理。

public class ExternalConnection{

       HttpClient client = HttpClient.newHttpClient();
       HttpRequest request = HttpRequest.newBuilder()
                                       .uri(URI.create(<Custom_URL>))
                                       .build();
       
       public Response getResponse(){
             // use the client, send request and get response 
       }
       
}

public class ProcessNewIncomingRequest extends DoFn<String, KV<String, String>> {
        
        @ProcessElement
        public void processElement(){
             Response response = new ExternalConnection().getResponse();
        }
}

以上2种方式,哪一种在性能和编码设计标准方面更好?

这两种方法都行得通; StartBundle/FinishBundle 一个更包含恕我直言,但缺点是如果您的捆绑包非常小,则效果不佳。更好的方法可能是使用 DoFn 的 SetUp/TearDown,它可以跨越任意数量的包,但与 DoFn 的生命周期相关(利用 Beam SDK 已经做的 DoFn 实例池)。