【问题标题】:How would you approach a Twitter-like application with Azure table storage?您将如何使用 Azure 表存储来处理类似 Twitter 的应用程序?
【发布时间】:2011-01-17 20:42:47
【问题描述】:

我正在考虑一个非常简单的类似 Twitter 的应用程序,我正在考虑仅支持 twits 和时间线。

但是我的头脑,非常习惯于关系模型......无法在 Azure 表或 noSql 中提出合理的模型。基本上,我在想:

  • 用户可以将其他用户添加为 朋友。
  • 用户可以编写消息(最多 200 字符)。
  • 消息总是按顺序显示 时间,最新的在前。
  • 用户页面显示他最近的 20 消息。
  • 主页(时间线)显示 他和他的最近 20 条消息 朋友。

很简单:D

如果我将所有消息放在一个表中,并将 userId 作为分区键......一切都很简单,但是......我不认为该解决方案可以很好地扩展。但是其他解决方案使时间线页面非常复杂或非常低效,因为它不是要从每个朋友那里获取最新的 20 条消息,而是要从所有人那里获取最新的 20 条消息……这让我大吃一惊。可能是你有一个非常讨厌的朋友,最近 20 条消息来自他 :D

以 Azure 表格方式存储此信息的可扩展且有效的方法是什么?

提前致谢。

【问题讨论】:

    标签: twitter azure nosql data-modeling azure-table-storage


    【解决方案1】:

    我会说仅使用 Azure 表存储是不够的。您也应该使用 Azure 队列。 当消息进入时,它会被放入队列中。工作人员从队列中获取消息并处理它们。

    1. 消息出现在公共时间线上(以时间戳为键的表格)
    2. worker 获取发布消息的用户的所有关注者,并将消息的副本放在他们的每个时间线上(由 followerId 键入的表)
    3. 当然,消息也会放在用户的时间线上。 (由 UserId 键入的表)

    这似乎是一种浪费的方法,但您正在优化读取性能,并最终保持写入的一致性。从读取端移除连接可以简化操作。

    【讨论】:

    • 对此投了赞成票,完全同意。快速读取的关键是去规范化(这会使写入变慢)。
    • 如果你有 200 个朋友,你会写 201 次这条消息吗?这不是矫枉过正吗? :O 我理解非规范化,但这对我来说很奇怪哈哈 :D 在这种情况下没有办法使用表分区键并减少写入量?
    • 从关系的角度来看,是的,这很奇怪。但这是你必须做的才能获得尽可能快的读取速度(写入速度对用户来说不太明显)。您已经在使用分区键来帮助加快读取速度,因此您无法加快写入速度。
    • 我开始明白这一点... :D 谢谢大家。
    • 我知道这个答案(有点)旧,但我想知道,按照这个设计,如何处理删除推文?
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多