如何构建需要进行多个 HTTP 调用的 Kiba 项目

How to structure a Kiba project that needs to do multiple HTTP calls

我正在考虑用 kiba 编写我们的 ETL(或类似 ETL)进程之一,我想知道如何构建它。我的主要问题是整体架构。过程大致是这样的:

  1. 从 HTTP 端点获取数据。
  2. 对于从 API 返回的每个项目,再进行一次 HTTP 调用
  3. 对第 2 步返回的每一项进行一些转换
  4. 将每个项目发送到其他地方

现在我的问题是:如果只有第一步是 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 并行化)。