【问题标题】:Bringing incremental data in from REST APIs into SQL azure将增量数据从 REST API 引入 SQL azure
【发布时间】:2019-07-15 15:54:22
【问题描述】:

我的需求如下: - 需要从第三方 API 获取数据到 SQL azure。

  • 每天都会查询 API 以获取增量数据,并且可能需要分页,因为默认情况下任何 API 响应都只会提供前 N 条记录。

  • API 还需要一个身份验证令牌才能工作,这是我们开始从端点下载数据之前的第一次调用。

由于最后两个原因,我选择了每天触发的 Function App,而不是可以查询 Web API 的数据工厂。

有没有更好的方法来做到这一点? 此外,我正在考虑将所有 JSON 推送到 Blob 存储中,然后将 JSON 中的数据解析到 SQL Azure 中。有什么建议吗?

【问题讨论】:

  • 你有多少条记录?你做一些预处理吗?每条记录有多重?

标签: azure azure-sql-database azure-functions azure-data-factory


【解决方案1】:

要考虑规模的一件事是并行化查询和处理。如果没有排序要求,或者如果处理 所有 记录将花费超过 10 分钟的函数超时时间。或者,如果您想对传输中的数据进行一些调整/转换,或者如果您对不同类型的数据有不同的目的地。或者,如果您想避免失败 - 例如,您的函数在处理过程中失败并且您不想重新查询 API。或者您以不同的方式获取数据并希望在流程中的特定步骤开始处理(而不是从入口点运行)。种种原因。

我要在这里提醒您说,最佳并行度与复杂性在很大程度上取决于您的舒适度和要求。下面的示例在某种程度上是一个“极端”示例,它将过程分解为离散的步骤并为每个步骤使用一个函数;在某些情况下,拆分特定步骤并将它们组合成一个步骤可能没有意义。 Durable Functions 也有助于使编排这可能更容易。

  • 一个计时器驱动的函数,它查询 API 以了解所需页面的深度,或将其他页面排队到第二个函数,该函数实际上进行分页 API 调用
  • 然后该函数查询 API,并写入暂存区(如 Blob)或将每一行放入待写入/处理的队列中(例如,存储队列之类的东西,因为它们既便宜又快速,或者如果多方感兴趣(例如,发布/订阅),则为服务总线队列
  • 如果写入暂存 blob,则由 blob 触发的函数读取 blob 并将单个写入排队到队列(例如,存储队列,因为存储队列对于这种情况来说既便宜又快速)
  • 另一个队列触发函数实际上处理将各个行写入行中的下一个系统、SQL 或其他方式。

您将从中获得一些并行化,并且能够从流程中的任何步骤开始,并使用格式正确的消息。如果您的处理器遇到不良数据,诸如毒物队列/死信队列之类的东西将有助于处理异常情况,因此您可以手动修复不良数据,而不是整个进程死亡。

【讨论】:

    【解决方案2】:

    调用所有页面需要多长时间?如果是under ten minutes,那么我的建议是构建一个 Azure Function 来查询 API 并将 json 数据直接插入 SQL 数据库。

    Azure 函数

    Azure 函数非常 cost effective。前一百万的执行是免费的。如果它需要超过十个,那么看看耐用的功能。对于处理分页,我们有很多例子。您的确切解决方案将取决于您调用的 API 和您使用的语言。这是C# using HttpClient 中的一个示例。这是Python using Requests 的一个。对于两者来说,模式是相似的。从 API 获取总页数,将变量设置为该值,然后遍历页面;在每次迭代中获取和保存数据。如果 API 无法提供最大页数,则循环直到出现错误。 Protip:确保为这些循环指定一个上限。此外,如果您的 API 不稳定或有间歇性故障,请考虑使用优雅的重试模式,例如 exponential backoff

    Azure SQL Json 索引计算列

    您提到将数据作为 json 文件存储到存储容器中。你确定你需要那个吗?如果是这样,那么您可以create an external table link between the storage container and the database。这样做的好处是数据不会占用数据库中的任何空间。但是,如果 json 适合数据库,我会强烈建议将该 json 直接放入 SQL 数据库并利用 indexed calculated columns 来非常快速地查询 json。

    使用这种配对应该可以提供令人难以置信的性价比!让我们知道您最终使用的是什么。

    【讨论】:

      【解决方案3】:

      如果你可以在你的api中设置默认的前N个值,那么你可以在azure数据工厂中使用web activity来调用你的rest api来获取响应数据。然后将响应数据配置为复制活动的输入(@ 987654327@) 和 sql 数据库作为输出。请看这个帖子:Use output from Web Activity call as variable

      网络活动支持您的访问令牌的authentication 属性。

      我也在考虑将所有 JSON 推送到 Blob 存储中,然后 将数据从 JSON 解析到 SQL Azure。有什么建议吗?

      好吧,如果您可以将数据转储到 blob 存储中,那么azure stream analytics 是您的最佳选择。

      您可以使用asa sql运行日常作业以选择或解析json数据,然后将数据转储到sql数据库中。请参阅official sample.

      【讨论】:

        【解决方案4】:

        也许你可以通过 SQL Server Agent 创建一个时间任务。

        SQL server Agent--new job--Steps--new step:

        在命令中,例如输入您的Import JSON documents from Azure Blob Storage sql statemanets。

        Schedules--new schedule: 设置执行时间。

        但我认为 Azure 函数更适合您执行此操作。Azure Functions 是一种在云中轻松运行小段代码或“函数”的解决方案。您可以只编写手头问题所需的代码,而不必担心整个应用程序或运行它的基础设施。函数可以使开发更加高效,您可以使用您选择的开发语言,例如 C#、F#、Node.js、Java 或 PHP。

        更直观、更高效。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2016-09-25
          • 1970-01-01
          • 2017-11-29
          • 2019-08-05
          • 1970-01-01
          • 1970-01-01
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多