如何从 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 中的数据的外部函数。
我正在为我的公司进行一个细分项目,我们必须创建一个管道来从我们的应用程序用户那里收集数据,当他们适合一个细分市场时,应用程序将接收该信息并对其进行处理(不在我的范围内)。因此,目前,客户端连接到一个端点并对其进行身份验证,该端点允许其客户端将 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 中的数据的外部函数。