1

我在 Rails 后台作业中运行 Kiba ETL 管道。我想在作业运行时向用户提供一些状态。实现这一目标的最佳方法是什么?

我可以以某种方式使用一些变量吗?

或者我应该在每一步之后将状态更新保存在数据库中(一次在源中,每次转换一次,一次在目标中)?每次转换一次似乎需要大量额外的数据库写入,而且从转换与数据库对话似乎有点“脏”。

谢谢!

4

1 回答 1

2

要实现这种类型的用例,您必须在工作中加入某种形式的进度跟踪。

它可以向数据库记录报告(这将对工作进行建模 - 如果您正在执行一些重量级的导入并希望能够在之后进行搜索,那么建议您这样做),但您也可以向某种形式的 pub-sub 系统(redis ,Postgres,ActionCable ...)如果您想要更即时和更轻量级的东西。

转换实际上是跟踪进度的好地方,但这并不意味着您必须在每一行报告(因为它会导致在每一行写入 SQL,这通常太多了!)。

我建议每 N 行报告一次进度,使用如下代码:

pre_process do
  @count ||= 0
end

transform do |r|
  @count += 1
  if @count % 500 == 0
    # TODO here: notify the report system
  end
  r
end

您将需要考虑如果在通知报告系统时发生错误会发生什么:也许您想停止一切,或者您想继续。

还要确保跟踪作业的开始和作业的结束(成功/错误/完整性),以确保您不会以过时的作业结束。

与数据库交谈似乎有点“肮脏”,但这只是因为我们有点混淆了关注点。如果您每 N 行执行一次并确保不污染主系统,那就太好了!

希望这会有所帮助,如果您需要进一步的帮助,请告诉我!

于 2020-04-05T09:36:44.857 回答