跨所有实例在 appengine 上存储对象列表
Posted
技术标签:
【中文标题】跨所有实例在 appengine 上存储对象列表【英文标题】:Storing a list of objects on appengine across all instances 【发布时间】:2013-08-13 01:06:02 【问题描述】:我在 Google App Engine 上有一个应用程序。它处理实时数据而不考虑过去的数据(因此没有数据存储/完全持久性),因此我不需要任何非常可靠的东西来在实例崩溃或新部署的情况下恢复数据。
由于负载的原因,我有多个实例需要共享一个对象列表。我查看了 memcached,但这需要映射样式界面中从键到对象的映射,而不能转储所有条目。
此外,我希望条目可以过期,除非“碰撞”,尽管这可以在用户代码中处理。
什么是不涉及数据存储的合理解决方案?我希望它能够处理来自多个应用程序引擎实例的并发读取和写入(这就是为什么简单的 Java 对象声明不能像每个实例一样工作)。
Memcached 可能会存储单个对象,但它需要获取对象、获取某种锁、修改它并将其写回缓存。
注意现有应用引擎数据存储中存在不相关的数据。
澄清:我需要所有个实体。实体本身可以随时修改、过期或半自动删除或从头开始创建。我不是特别擅长可计费的后端。
编辑:是的,它适用于本地存储的单个列表,但我预计需要多个实例的情况下会出现峰值。尽管我不介意同步延迟,但我至少需要一种尽力而为的方法来获取完整列表。但是,没有后端的所有实例之间的循环通信将相对不可扩展,而且我会更多地陷入租用服务器的场景。
我不在乎更改是否在另一个前端实例上提交更改后没有立即通过。然而,这些变化需要 100% 确定地通过。我只看到 lastSeen 值(long)增加的插入和更新。更新也应该在所有实例上复制或反映。
注意:由于当时我无法控制的情况,我无法授予赏金,因此奖励已退还。我会尽可能重新添加。
【问题讨论】:
memcache 好像是它,Memcache 服务中有CAS Compare-And-Set。不给你转储所有实体 - 如果你不需要恢复为什么你需要转储所有实体。后端可能是另一种选择,它维护数据集的内存结构,前端与之对话。 @TimHoffman 我需要一个完整的实体列表。我需要向客户展示全部 1000 个左右。我还需要为后端购买额外的配额,对吧? 是的,您需要额外的后端配额。 @TimHoffman 唉,这就是问题所在。我目前正在免费使用,这是一个个人项目,我不希望通过后端让自己变得更瘦。 注意:由于当时的情况,我无法控制奖励,因此奖励已退还。我会尽可能重新添加。 【参考方案1】:这里的数据存储有什么问题?
如果您担心在数据库中有很多项目会花费太多费用,只需使用 datetime_created
字段和 auto_now_add=True
(或 Java 等效项;我来自 Python)保存每个项目,并安排一个 cron 来检查并删除任何旧的东西?
据我所知,Datastore 对于并发读写来说应该是高度可用的。
您也可以考虑离开 AppEngine。 Redis 听起来像是您所描述的工作的正确工具,AWS 上的 Elastic Beanstalk 可能可以很好地满足您的需求。当然,设置起来需要更多的努力,但可能不是压倒性的。
【讨论】:
我对成本的关注不在于存储量,而在于操作次数。要获取最近的条目,这需要一个索引,并且刷新一个条目(每个条目设计为每 20 秒从外部请求刷新一次)需要 4 次数据存储写入。计算这 100 个从外部主动刷新的条目相当于 1,728,000 次数据存储操作,更不用说供客户端读取的索引查找了。以上是关于跨所有实例在 appengine 上存储对象列表的主要内容,如果未能解决你的问题,请参考以下文章
为Google Cloud AppEngine配置MemSql
当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?