确实最好使用单个source
,您将使用它来获取数据的主要流。
一般建议:尽可能多地分批工作(例如,在源代码中分页,但如果 API 在步骤 2 中支持,还可以批量 HTTP 查找)。
源部分
例如,在您的情况下,源可能是分页 HTTP 资源。
实现它的第一个选项是编写一个专用类,如文档中所述。
第二种选择是像这样使用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
ParallelTransform
通过 Kiba Pro (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
如果需要仍然可以并行化)。