防范 BigQuery 垃圾邮件
Protect against BigQuery spam
我有以下软件组件:
- Amazon Kinesis 事件流
- 示例事件 table:
product-purchase-events
- BigQuery db 接收+存储事件
- 示例查询:
SELECT count(*) as count, DATE(timestamp) as day FROM product-purchase-events GROUP BY day
- 微服务公开 API 做 运行 一组预定义的 BigQuery 查询
- 示例端点:
GET /product-purchase-event/?step=DAY
- Public Web 应用程序使用查询 API 来展示漂亮的图表
事实: BigQuery 每次查询的费用和统一费率非常昂贵。
问题: 如果有人向 GET /product-purchase-event
端点发送垃圾邮件,每次调用都会执行一个新的查询,这意味着在 100 万次垃圾邮件查询后我会得到一个非常好的账单。
我的问题:你能用垃圾邮件保护 BigQuery 吗?我知道有24小时缓存,但我希望数据尽可能实时
我也知道还有其他解决方案,例如 Amazon Redshift,它按小时计费而不是按查询计费,但我想知道我是否可以使用 BigQuery 解决这个垃圾邮件问题。似乎大多数人只在内部使用它,这意味着没有外部人员可以执行查询,因此垃圾邮件不是问题。
正如您正确推测的那样,将交互式 public 网络端点连接到 运行 直接作为 BigQuery 查询的处理程序是个坏主意。这里有多种因素,包括成本和延迟。此外,查询正在接收流式插入的 table 意味着您将无法利用基本的 BigQuery caching mechanism,一旦您的 public 处理程序开始获得合理的处理程序,您将很快达到并发限制负载量。
此处更典型的模式是通过 BigQuery 查询定期计算聚合,然后读取这些查询结果并将其传播到更适合以点查找方式提供结果的存储 layer/system。例如,像数据存储,或内存键值存储,甚至像云 SQL.
这将您的服务架构与数据处理分离,并且 public 处理程序大大简化:它只是从存储层获取聚合。
您还可以更细致地处理 "when do we recompute"。您可以将处理定义为在固定时间间隔内简单地重新 运行,利用对数据陈旧性的感知,或者根据您环境中的其他信号构建一些自定义缓存语义。
我有以下软件组件:
- Amazon Kinesis 事件流
- 示例事件 table:
product-purchase-events
- 示例事件 table:
- BigQuery db 接收+存储事件
- 示例查询:
SELECT count(*) as count, DATE(timestamp) as day FROM product-purchase-events GROUP BY day
- 示例查询:
- 微服务公开 API 做 运行 一组预定义的 BigQuery 查询
- 示例端点:
GET /product-purchase-event/?step=DAY
- 示例端点:
- Public Web 应用程序使用查询 API 来展示漂亮的图表
事实: BigQuery 每次查询的费用和统一费率非常昂贵。
问题: 如果有人向 GET /product-purchase-event
端点发送垃圾邮件,每次调用都会执行一个新的查询,这意味着在 100 万次垃圾邮件查询后我会得到一个非常好的账单。
我的问题:你能用垃圾邮件保护 BigQuery 吗?我知道有24小时缓存,但我希望数据尽可能实时
我也知道还有其他解决方案,例如 Amazon Redshift,它按小时计费而不是按查询计费,但我想知道我是否可以使用 BigQuery 解决这个垃圾邮件问题。似乎大多数人只在内部使用它,这意味着没有外部人员可以执行查询,因此垃圾邮件不是问题。
正如您正确推测的那样,将交互式 public 网络端点连接到 运行 直接作为 BigQuery 查询的处理程序是个坏主意。这里有多种因素,包括成本和延迟。此外,查询正在接收流式插入的 table 意味着您将无法利用基本的 BigQuery caching mechanism,一旦您的 public 处理程序开始获得合理的处理程序,您将很快达到并发限制负载量。
此处更典型的模式是通过 BigQuery 查询定期计算聚合,然后读取这些查询结果并将其传播到更适合以点查找方式提供结果的存储 layer/system。例如,像数据存储,或内存键值存储,甚至像云 SQL.
这将您的服务架构与数据处理分离,并且 public 处理程序大大简化:它只是从存储层获取聚合。
您还可以更细致地处理 "when do we recompute"。您可以将处理定义为在固定时间间隔内简单地重新 运行,利用对数据陈旧性的感知,或者根据您环境中的其他信号构建一些自定义缓存语义。