首页 > 解决方案 > 在 apache Beam 中调用外部 API 的更好方法

问题描述

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

方法一:

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

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();
        }
}

方法二:

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

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 种方法中哪一种在性能和编码设计标准方面更好?

标签: design-patternsgoogle-cloud-dataflowapache-beamapache-beam-io

解决方案


任何一种方法都可以正常工作;恕我直言,StartBundle/FinishBundle一个包含更多内容,但如果您的捆绑包非常小,则其缺点是无法正常工作。更好的方法可能是使用 DoFn SetUp/TearDown,它可以跨越任意数量的捆绑包,但与 DoFn 的生命周期相关(利用 Beam SDK 已经完成的 DoFn 实例池)。


推荐阅读