Firebase拥有数千个on()事件监听器的良好设计

时间:2016-04-07 07:30:34

标签: angularjs node.js firebase

我们需要在Firebase数据库上运行一些操作,并在用户从移动设备修改标志的某些输入后操作数据。

目前我们使用on()来监听每个用户节点中的特定标志。我们正在Heruku上托管的Nodejs服务器上运行这个监听器。

如果我们计划拥有10万用户,我们将拥有10万名听众。每个用户标志的一个监听器,等待用户在移动设备上操作。

就Firebase而言,这是一个很好的设计吗?

理想情况下,我们可以创建一个由用户调用的REST API,然后在Node JS服务器上我们可以操作数据。

根据用户输入在Firebase上运行数据后台操作的最佳方法是什么?

我们之前使用的是Parse,使用Parse Cloud代码很容易实现这一点。有了Firebase,我们就会因此而遇到问题。

1 个答案:

答案 0 :(得分:3)

  

如果我们计划拥有10万用户,我们将拥有10万名听众。每个用户标志的一个监听器,等待用户在移动设备上操作。

这听起来像是糟糕的数据设计。虽然绝对有可能倾听数十万件物品的变化,但它不应该需要数十万听众。

我的猜测(因为你没有包含你的JSON片段)是你有一个类似的结构:

users
  $uid
    name: "user6155746"
    flag: "no"

并且您只是在每个用户的flag附加了一个监听器:

ref.child('users').on('child_added', function(userSnapshot) {
  userSnapshot.ref().child('flag').on('value', function(flagSnapshot) {
    console.log('the flag changed to '+flagSnapshot.val());
  });
})

在代码中这很简单,实际上你很难管理"标志监听器"。你什么时候删除它们?你有他们的清单吗?

如果您在JSON树中隔离您感兴趣的信息,所有这些事情都会变得更简单:

users
  $uid
    name: "user6155746"
userFlags
  $uid: "no"

现在,您只需在userFlags上收听,看看是否有任何用户的标记已更改:

ref.child('userFlags').on('child_changed', function(userSnapshot) {
  console.log('Flag of user '+userSnapshot.key()+' changed to '+userSnapshot.val());
});

有了这个,你就有了一个监听器,监视着可能有数十万用户的标志。