如何从 API 中的 Snowflake Table 高效且 cost-effectively 获取分割数据?

How to get segmentation data from Snowflake Table in API efficiently and cost-effectively?

我正在为我的公司进行一个细分项目,我们必须创建一个管道来从我们的应用程序用户那里收集数据,当他们适合一个细分市场时,应用程序将接收该信息并对其进行处理(不在我的范围内)。因此,目前,客户端连接到一个端点并对其进行身份验证,该端点允许其客户端将 JSON 数据发送到 Elasticsearch 集群(应用程序启动、关卡完成等)。然后我使用 Azure 函数每 5 分钟获取一次实时数据并将其存储在 Azure Blob 存储中,然后创建一个队列,Snowflake 读取并摄取 JSON 文件。然后,我们将使用 Snowflake 对每个细分市场执行 运行 一项任务(这将由分析师或高管决定),数据将输出到 table,如下所示:

AccountID Game SegmentID CreatedAt DeletedAt
123456789 Game 1 1 2021-04-20 2021-04-21
123456789 Game 1 2 2021-04-20
123456789 Game 1 3 2021-04-20

其中 SegmentID 可以表示类似

SegmentID SegmentType SegmentDescription
1 5 Day Streak User played for 5 consecutive days
2 10 Day Streak User played for 10 consecutive days
3 15 Day Streak User played for 15 consecutive days

在管道的下一步中,同一个 API 通过身份验证的用户应该 post 在游戏启动时请求获取用户匹配的所有片段。然后,开发团队将决定在 session 中的位置、时间以及如何使用这些信息来个性化内容。类似于:

select
  SegmentID
from
  SegmentTable
where
  AccountID='{AccountID the App authenticated with}' and
  Game='{Game the App authenticated with}' and
  DeletedAt is null

回复:

SegmentID
2
3

连载:

{"SegmentID": [2,3]}

我们预计每天大约有 300K-500K 用户。我的问题是,什么是最有效和 cost-effective 将此信息从 Snowflake 返回给客户端的方法,这样大量的用户在查询同一端点时不会有问题,而且不会昂贵。

好的,所以有点变通,但我在 Snowflake 上创建了一个外部函数(使用 Azure Functions),它在本地 MongoDB 集群中更新数据。因此 API 连接到 MongoDB 实例,该实例可以处理大量并发连接,并且由于它位于本地服务器上,因此非常便宜。唯一的成本是从 Snowflake 到 MongoDB 的数据传输以及 Azure Functions 上应用服务计划的 运行(无法使用基于消费的方式将数据发送到我们的内部服务器,我需要创建一个VNET、NAT 网关和 Azure 中的静态出站 IP 地址)以及我必须在 Azure 中创建的 API 管理服务。

那么它是如何工作的呢?对于 Snowflake 中的每个存储过程,最后我收集已更改的段(新行或 DELETED_AT 不为空)并触发使用 pymongo 客户端更新 MongoDB 中的数据的外部函数。