在 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 实例池)。
我有 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 实例池)。