【问题标题】:Implement "following" feature efficiently on GAE在 GAE 上有效地实现“跟随”功能
【发布时间】:2012-02-16 17:19:49
【问题描述】:

我正在使用 Java/GAE 上的“跟随”功能实现一个 iPhone 应用程序。 此功能与 Instagram 的相似之处在于用户可以关注其他用户的活动。事件可以是发布的新照片、喜欢照片、关注其他用户等。

假设我们有两个实体:Follow 和 Event,它们都引用了用户 ID。

所以我正在考虑使用 OR 查询来列出目标用户的事件。但是 GAE 不支持 OR 查询,并且发出单独的查询也会效率低下,因为查询的数量可能非常大(例如,100 多个以下是常态)。

这样做的常见做法是什么?

【问题讨论】:

  • 能否列出不允许的 OR 查询,以及效率不高的单独查询?

标签: java google-app-engine scalability instagram


【解决方案1】:

我会为订阅和订阅者使用 ListProperty。每次订阅用户发帖时,您都会使用一项任务来添加条目以供每个订阅者查看。就像 Rick Mangi 指出的那样,关系模型不会帮助您处理数据存储。如果您使用的是新的 NDB API,则可以改用 repeated 属性。由于您正在为每个观察者创建实体,因此异步 API 可能会很方便。

【讨论】:

    【解决方案2】:

    您必须停止在关系模型中思考 ;-) 我们在我们的应用程序上做了类似的事情。在被关注用户的实体中保留“订阅”给被关注用户的 UID 列表。当用户执行需要通知的操作时,会为每个关注该用户的用户创建一个事件实体(是的,一个受欢迎的用户可以创建一大堆条目,这可以卸载到任务队列)。

    当用户检查通知时,您可以通过他的 UID 获取它们。由于这是索引的,它将很快返回。当您获取事件时,删除它们或将它们标记为已读。

    请记住,连接和其他过滤查询非常慢,但获取大量索引记录却不是。如果某事要创建大量记录,请将其卸载到任务队列。

    【讨论】:

      【解决方案3】:

      我们正在实施 Etsy 在其公开幻灯片分享中描述的模型。

      这是架构图。

      强烈建议您完整阅读他们的演示文稿。

      Etsy Activity Feed Arch

      【讨论】:

      • 我一定会检查的。非常感谢您的链接!
      • 还可以查看 PubNub 的订阅事件服务,它也可以工作。虽然我不喜欢他们让你为批量用户付费的定价模式。
      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2017-03-12
      • 2011-07-22
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多