2014-09-10 135 views
2

我正在研究一个我想编写的实时应用程序的阶段,我认为Firebase是正确的选择,但我目前正试图弄清楚我的数据模式。我的应用程序与Firefeed示例应用程序相似,因为它是一个社交收件箱。我的问题是下面的代码,数据被循环并复制到“跟随”当前用户的每个用户。理论上,如果这是Twitter,而像Kim Kardashian这样的人发布了一个新的Spark,它将不得不循环并节省50,000,000多条记录。Scaling Firefeed Followers

在客户端执行此操作或完成此操作似乎非常缓慢且容易出错。这是一个有效的关注吗?我意识到我的应用程序现在有零用户,但我想提前计划我的缩放比例。

// Add spark ID to the feed of everyone following this user. 
currentUser.child("followers").once("value", function(list) { 
    list.forEach(function(follower) { 
     var childRef = firebase.child("users").child(follower.name()); 
     childRef.child("feed").child(sparkRefId).set(true); 
    }); 
}); 

我真的很感谢所有帮助和有识之士莅临!

谢谢。

回答

2

tl; dr:我会等到你在编码解决方案之前再进一步。避免过早优化。

远期扩展问题很难优化,因为很难预测人们最终如何使用软件。

但是,要回答您的具体问题,有办法处理社交媒体世界的金卡戴珊姐妹。这一切都归结为分区行为。你将不得不对待他们不同于其他用户。无论您使用的技术堆栈如何,您都必须这样做。

分区行为的程度在很大程度上取决于用户的分布情况。还记得MySpace的Tom吗?这是一个极端的例子。我敢打赌,有人提到isTom遍布整个代码库来处理它,但我们可能不需要那么远。

在你的问题代码片段的情况下,它的规模已经有了很大的提高。它将数据分发给所有追随者,并且这样做不会在数据中产生任何热点。然而,它将花费一些时间来运行50,000,000个用户。

我的第一次优化尝试将采取相同的代码,并把它放在节点工人。然后,我会切换客户端为我非常受欢迎的用户注册该节点工作人员的任务。

如果仍然不够快,我会开始研究如何为我的超级用户分区数据。