0

我正在寻找一个合适的谷歌数据/存储选项,用作将原始 JSON 事件流式传输到的位置。

这些事件是由用户响应非常大的电子邮件广播而生成的,因此吞吐量可能在某一时刻非常低,在短时间内高达每秒约 25,000 个事件。这些事件的 JSON 表示每个可能只有 1kb 左右

我想简单地将这些事件存储为原始和未处理的 JSON 字符串,仅追加,并为插入的每条记录使用单独的顺序数字标识符。我计划使用此标识符作为消费应用程序能够按顺序处理流的一种方式(以类似于 Kafka 消费者通过流跟踪其偏移量的方式) - 这将允许我重播事件流从我选择的角度来看。

我正在利用 Google Cloud Logging 来聚合来自 Compute Engine 节点的事件流,从这里我可以直接流式传输到 BigQuery 表或 Pub/Sub 主题。

BigQuery 似乎不仅能够处理流式插入,但它似乎没有自动递增 id 列的概念,并且还表明它的查询模型最适合聚合查询而不是窄结果集。我查询下一个最高行的要求显然与此背道而驰。

我目前最好的想法是推入 Pub/Sub 并将每个事件写入 Cloud SQL 数据库。这样,如果 Cloud SQL 无法跟上,Pub/Sub 可以缓冲事件。我对自动标识符和可能的日期戳列的渴望使这感觉像是一个“表格”用例,因此我觉得 NoSQL 选项也可能不合适

如果有人有更好的建议,我很想得到一些意见。

4

1 回答 1

1

我们知道许多客户已成功使用 BigQuery 来实现此目的,但如果您想提供自己的标识符,则需要做一些工作来选择合适的标识符。从您的示例中我不清楚为什么不能只使用时间戳作为标识符并使​​用摄取时间分区表流摄取选项?

https://cloud.google.com/bigquery/streaming-data-into-bigquery#streaming_into_ingestion-time_partitioned_tables

至于 Cloud Bigtable,正如 Les 在评论中指出的那样:

Cloud Bigtable 肯定可以跟上,但并不是真正为使用顺序键的顺序添加而设计的,因为这会产生热点。

请参阅:您可以查阅此https://cloud.google.com/bigtable/docs/schema-design-time-series#design_your_row_key_with_your_queries_in_mind

您可以在这里再次使用时间戳作为键,尽管您可能想要做一些工作来添加哈希或其他唯一性,以确保在 25k 写入/秒的峰值时您不会压倒单个节点(我们通常每个节点每秒可以处理大约 10k 行修改,如果您只使用字典顺序的 ID(如递增数字),那么您的所有写入都将发送到同一台服务器)。

无论如何,BigQuery 似乎是您想要使用的。您还可以参考此博客文章,了解通过 BigQuery 进行事件跟踪的示例: https ://medium.com/streak-developer-blog/using-google-bigquery-for-event-tracking-233​​16e187cbd

于 2019-03-08T23:43:48.560 回答