API 设计:响应数据跟踪分析

API design: Response data tracking analytics

假设我们是 运行 一家在线商店,我们的数据库中有 Product table。这表示存在的产品:

productId brandId (FK) name description capacity pricePerNight
1 2 Tent This is a tent 4 20

现在假设我正在制作一个 public API,它允许外部公司客户根据一些参数查询我商店中的可用产品。这个 public API 每周接到数千个电话。

我想跟踪此 public API 退回产品(例如帐篷)的次数,并且我想了解此数字随时间的变化情况。

我的解决方案:

实施 table(例如 View)并在每次返回产品时(异步)插入一个新行:

productId (FK) date
1 24/03/2021
1 26/03/2021

我在这里看到的问题是 table 会很快变得非常大(每周可能有 100,000 行新行)。我不确定这将如何影响整体数据库性能 (MYSql),但它似乎不可扩展。

你能告诉我一个更好的解决方案吗?谢谢!

由于这样做的目的是提供离线分析,因此最好让您的 API 发布包含产品 ID 和时间戳的事件流。然后,该流的使用者可以从主服务的 MySQL.

跟踪不同数据存储(Cassandra、DynamoDB、Cosmos、Elasticsearch、某些时间序列数据库等)中的聚合等

至于“发布流”的含义,它可以像另一个具有 HTTP/gRPC/whatever 端点的服务一样简单。向 Kafka/Pulsar 主题或某些 MQ 发布消息也是可行的。被 Filebeat 拾取并被 Logstash 理解的日志消息甚至是可行的。

需要注意的一件重要事情是,发布此流可能是您应该考虑忽略失败的地方(即“即发即忘”发布):假设查询此 API 的用户可能对您的业务很重要,因为您无法记录事情以供以后分析而让他们的请求失败真的有意义吗?出于同样的原因,几乎可以肯定最好是异步执行此操作,只要需要安排任务发布事件,就会影响服务 API 响应的热路径。您可以将不可避免的丢弃事件基本上视为随机抽样的一种形式:很有可能,没人关心帐篷实际上出现在 1000 个请求中,而统计服务报告 997(如果业务人员拒绝,请询问他们是否有 100% public API 上 0.3% 故障率的统计服务准确率优于 99.7% 准确率的 public API 上 0% 故障率服务...)。