【发布时间】:2014-03-23 08:34:21
【问题描述】:
我正在尝试设计一个应用,它使用 Google AppEngine 来存储/处理/查询数据,然后通过 Cloud Endpoints API 尽可能实时地将数据提供给移动设备。
这是一个足够直截了当的解决方案,但我正在努力在 AppEngine 的性能、成本和延迟之间取得适当的平衡。
场景(类比)是用户签到(每天从不同地点、城市、国家多次签到),我们希望允许用户通过他们的设备查询所有数据并提供最新信息尽可能。
- 如:
- 最近签到次数:
- 24 小时
- 1 周
- 1 个月
- 所有时间
- 在同一时间段内检查最多的地方/城市/国家/地区是哪里
- 在同一时间段内检查最少的地方
- 其他类似的查询报告
我们可以使用 Memcache 来存储最近的签到,每 5 分钟推送到数据存储区,但这可能无法很好地扩展并且不够健壮! 使用 Cron 作业运行任务队列/Map Reduce,以每 30 分钟获取每个位置的聚合、平均值并更新数据存储。
挑战在于在数据存储上使用尽可能少的读/写,因为最近的“24 小时”数据每 5 分钟更改一次,因此最近几周的数据、最近几个月的数据等等也是如此。数据在某种程度上必须是动态的,所以它不是固定的时间点,它们总是在变化 - 这就是问题所在!
设置它不是问题,但要以有效的方式设置它,平衡用户的性能/延迟和我们的成本/配额并不是那么容易!
简单的解决方案是使用 SQL,并运行日期范围查询,但这不会很好地扩展。
我们最终可以使用 BigTable 和 BigQuery 进行“所有时间”时间段查询,但要通过 API 为用户提供尽可能实时的其他时间段数据,这证明是一个很大的挑战!
我们非常欢迎任何关于 AppEngine 架构/方法的建议。
非常感谢。
【问题讨论】:
标签: python google-app-engine mapreduce task-queue