我目前正在建立一个基于Firebase的社区,该社区具有类似于Facebook的时间表和帖子。用户创建帖子时,它应在其关注者的时间表中自动弹出。
Google建议通过扇出更新进行此操作:https://firebase.googleblog.com/2015/10/client-side-fan-out-for-data-consistency_73.html
但我想知道:如果某个用户拥有-假设有-20k的关注者,我将首先必须下载其所有关注者的列表(即使使用{ <user-id>: true }
这样的索引也将非常大),然后更新这些用户的时间表使用如下扇出方法:
// followers = { <user-id-1>: true, <user-id-2>: true, ... }
const fanout = {};
const post = { text: 'foo', timestamp: firebase.database.ServerValue.TIMESTAMP };
Object.keys(followers).map((key) => {
fanout[`timeline/${key}/${postId}`] = post;
});
firebase.database().ref().update(fanout);
对于安全规则来说,这也很难确定允许用户更新的时间线。
我的方法是监视全局帖子引用的服务器。如果有更新或添加的子项,它将查找帖子创建者的关注者并相应地更新时间表。这样,我不必摆弄安全规则,客户端要做的工作就少得多。
我错了吗?
最佳答案
如果您愿意在服务器上运行扇出,请务必这样做。当要散发的数据量太大而无法在客户端上运行时,它确实会消除潜在的瓶颈。
但是绝大多数项目永远都不会达到这个水平,而且在他们项目生命周期的早期,许多开发人员都不愿意运行服务器,即使仅仅是为了散发数据也是如此。因此,对于那些开发人员而言,客户端扇出是一个不错的选择。