如何构建需要进行多个 HTTP 调用的 Kiba 项目
How to structure a Kiba project that needs to do multiple HTTP calls
我正在考虑用 kiba 编写我们的 ETL(或类似 ETL)进程之一,我想知道如何构建它。我的主要问题是整体架构。过程大致是这样的:
- 从 HTTP 端点获取数据。
- 对于从 API 返回的每个项目,再进行一次 HTTP 调用
- 对第 2 步返回的每一项进行一些转换
- 将每个项目发送到其他地方
现在我的问题是:如果只有第一步是 source
并且直到最后的任何内容都是 transform
可以吗?或者以某种方式让每个 HTTP 调用成为一个 source
然后以某种方式组合这些调用(可能使用多个作业)会更好吗?
确实最好使用单个 source
,您将使用它来获取数据的主流。
一般建议:尽可能多地分批工作(例如,在源代码中分页,如果 API 在第 2 步中支持,还可以进行批量 HTTP 查找)。
来源部分
例如,您的案例中的来源可能是分页 HTTP 资源。
实现它的第一个选择是编写专用的 class,如文档中所述。
第二种选择是像这样使用 Kiba::Common::Sources::Enumerable
(https://github.com/thbar/kiba-common#kibacommonsourcesenumerable):
source Kiba::Common::Sources::Enumerable, -> {
Enumerator.new do |y|
# do your pagination & splitting here
y << your_item
end
}
# then
transform Kiba::Common::Transforms::EnumerableExploder
加入辅助 HTTP 来源
可以这样做:
transform do |r|
# here make secondary HTTP query
result = my_query(...)
# then merge the result
r.merge(secondary_data: ...)
end
通过 Kiba Pro 的 ParallelTransform
(https://github.com/thbar/kiba/wiki/Parallel-Transform):
支持该步骤中的查询并行化
parallel_transform(max_threads: 10) do |r|
# this code will run in its own thread
extra_data = get_extra_json_hash_from_http!(r.fetch(:extra_data_url))
r.merge(extra_data: extra_data)
end
还必须注意,如果您可以构造 HTTP 调用以一次处理 N 行(如果 HTTP 后端足够灵活),事情会更快。
第 3 步不需要具体建议。
将每个项目发送到其他地方
我很可能会为此实现一个目标(但实际上它也可以作为一个转换来实现,并且如果需要的话仍然与 parallel_transform
并行化)。
我正在考虑用 kiba 编写我们的 ETL(或类似 ETL)进程之一,我想知道如何构建它。我的主要问题是整体架构。过程大致是这样的:
- 从 HTTP 端点获取数据。
- 对于从 API 返回的每个项目,再进行一次 HTTP 调用
- 对第 2 步返回的每一项进行一些转换
- 将每个项目发送到其他地方
现在我的问题是:如果只有第一步是 source
并且直到最后的任何内容都是 transform
可以吗?或者以某种方式让每个 HTTP 调用成为一个 source
然后以某种方式组合这些调用(可能使用多个作业)会更好吗?
确实最好使用单个 source
,您将使用它来获取数据的主流。
一般建议:尽可能多地分批工作(例如,在源代码中分页,如果 API 在第 2 步中支持,还可以进行批量 HTTP 查找)。
来源部分
例如,您的案例中的来源可能是分页 HTTP 资源。
实现它的第一个选择是编写专用的 class,如文档中所述。
第二种选择是像这样使用 Kiba::Common::Sources::Enumerable
(https://github.com/thbar/kiba-common#kibacommonsourcesenumerable):
source Kiba::Common::Sources::Enumerable, -> {
Enumerator.new do |y|
# do your pagination & splitting here
y << your_item
end
}
# then
transform Kiba::Common::Transforms::EnumerableExploder
加入辅助 HTTP 来源
可以这样做:
transform do |r|
# here make secondary HTTP query
result = my_query(...)
# then merge the result
r.merge(secondary_data: ...)
end
通过 Kiba Pro 的 ParallelTransform
(https://github.com/thbar/kiba/wiki/Parallel-Transform):
parallel_transform(max_threads: 10) do |r|
# this code will run in its own thread
extra_data = get_extra_json_hash_from_http!(r.fetch(:extra_data_url))
r.merge(extra_data: extra_data)
end
还必须注意,如果您可以构造 HTTP 调用以一次处理 N 行(如果 HTTP 后端足够灵活),事情会更快。
第 3 步不需要具体建议。
将每个项目发送到其他地方
我很可能会为此实现一个目标(但实际上它也可以作为一个转换来实现,并且如果需要的话仍然与 parallel_transform
并行化)。