design-patterns - 在 apache Beam 中调用外部 API 的更好方法
问题描述
我有 2 种方法来初始化HttpClient
,以便从 Apache Beam 中的 ParDo 进行 API 调用。
方法一:
初始化HttpClient
in 中的对象StartBundle
并关闭HttpClient
in 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 种方法中哪一种在性能和编码设计标准方面更好?
解决方案
任何一种方法都可以正常工作;恕我直言,StartBundle/FinishBundle
一个包含更多内容,但如果您的捆绑包非常小,则其缺点是无法正常工作。更好的方法可能是使用 DoFn SetUp/TearDown
,它可以跨越任意数量的捆绑包,但与 DoFn 的生命周期相关(利用 Beam SDK 已经完成的 DoFn 实例池)。
推荐阅读
- python - 如何在 for 循环中追加 pandas.DataFrame 中的行
- azure - 使用 Azure 设备预配服务取消预配设备
- c# - 私有方法与本地函数
- sql - Access 2003 SQL:from 子句中的语法错误
- java - 如何使用 Java 向 Google Chrome 图像发送请求?
- networking - ns3 - 如何只修改现有模块的一些文件?
- cors - 在 GraphDB 上启用 CORS
- firebase - Firestore 下载是否计入实时数据库下载配额?
- flutter - 关于 Flutter 中的 SQFlite 数据库
- c++ - C ++套接字客户端到python服务器没有创建连接