设计基于 Firebase 的可扩展 Feed 模型

2024-04-13

问题 :

如何设计一个以 Firebase 作为后端、可扩展的社交网络“提要”?

可能的答案:

“MVP”解决方案是设计一个feedsroot 子级,每个用户一个,并在每个关注者的提要中附加来自关注用户的任何新帖子。

users
  user1
    name: bob
  user2
    name: alice
    follows: 
      user1: true

posts
  post1
     author: user1
     text: 'Hi there'

feeds
  user2
    post1: true

这效果很好,并且在Firefeed项目。但它的扩展性并不好:如果凯蒂·佩里想要发布一些东西,她的手机将不得不写入数百万个提要。

因此报告中的解决方案这个问题 https://stackoverflow.com/questions/27544325/firebase-data-structure-is-the-firefeed-structure-relevant将此操作委托给基于服务器的进程。

我的问题是,Firebase 是一个“无后端”解决方案,这是我使用它的主要原因,所以我想确保在没有服务器的情况下绝对不可能实现此功能。

如果feeds孩子在上面的模式中被删除了?

然后执行以下操作:

baseRef.child('posts')
       .orderBy('author')
       .whereIn(baseRef.child('users/user2/follows').keys())

很遗憾,whereInFirebase API 中不存在,也不存在子查询:(

是否有其他不需要服务器的模型结构?

Thanks


Firebase 人员在他们的博客上回复道:https://www.firebase.com/blog/2015-10-07-how-to-keep-your-data-concient.html https://www.firebase.com/blog/2015-10-07-how-to-keep-your-data-consistent.html

这篇文章是关于“数据扇动”(在一个原子写入操作中将项目分散到多个节点)。

该技术极大地解决了原始问题的提要模型

该帖子实际上包含实现它的示例代码:

  • 创建扇出对象的函数(实际上是一个简单的对象,其键是要写入的 API 端点)

    function fanoutPost({ uid, followersSnaphot, post }) {
            // Turn the hash of followers to an array of each id as the string
            var followers = Object.keys(followersSnaphot.val());
            var fanoutObj = {};
            // write to each follower's timeline
            followers.forEach((key) => fanoutObj['/timeline/' + key] = post);
            return fanoutObj;  
    }
    
  • 以及使用该函数的逻辑:

    var followersRef = new Firebase('https://<YOUR-FIREBASE-APP>.firebaseio.com/followers');
    var followers = {};
    followersRef.on('value', (snap) => followers = snap.val());
    var btnAddPost = document.getElementById('btnAddPost');
    var txtPostTitle = document.getElementById('txtPostTitle');
    btnAddPost.addEventListener(() => {
          // make post
          var post = { title: txtPostTitle.value };
          // make fanout-object
          var fanoutObj = fanoutPost({ 
              uid: followersRef.getAuth().uid, 
              followers: followers, 
              post: post 
          });
          // Send the object to the Firebase db for fan-out
          rootRef.update(fanoutObj);
    });
    

注意:这比每次在一个关注者提要中循环写入更具可扩展性。然而,对于数百万粉丝来说,这仍然是不够的。在这种情况下,信任进行多次写入的服务器操作会更安全。我认为客户端最多可以用于数百个关注者,这是社交媒体上关注者的平均数量。 (不过这个还需要通过测试来验证)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计基于 Firebase 的可扩展 Feed 模型 的相关文章

随机推荐

  • 来自连接表的 SQL 计数

    我有一个表 lijsten 一个表 werknemerlijsten 和一个表 categorieen 现在我正在使用查询来获取计数 SELECT id naam beschrijving count wl werknemer id as
  • 复杂的查询应该写在Repository层还是Service层?

    我计划将我们的数据访问层迁移到使用存储库模式和工作单元 我确实知道存储库将帮助我轻松地将持久性存储 数据库 集合等 和技术 例如 EF 更改为 MongoDB 所以我注意到存储库实现的一些关键点 例如 Return IEnumerable代
  • 从数组 THREE.js 创建纹理

    我正在研究地形生成器 但我不知道如何处理颜色 我希望能够生成一张占据整个 PlaneGeometry 的图像 我的问题是如何根据我的高度图创建一个覆盖整个 PlaneGeometry 没有环绕 的单个图像 我可以想到一种方法 但我不确定它是
  • 更改 TabBarItem 的 ViewController

    是否可以更改 替换 UITabBarController 中选项卡之一的 ViewController 和 View 我想从特定选项卡以任意顺序在 3 个不同的视图控制器之间切换 这就是导航控制器不可能的原因 它们是使用 setViewCo
  • 为什么 TBitBtn 中包含的字形如此丑陋且过时? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Jetty 通过 Maven 正确运行,但作为 jar 运行不正确

    如果我的标题具有误导性 不正确 请提出更具描述性的内容 这是我能想到的最好的内容 我已经使用 spring roo 创建了自己的网络应用程序 但尚未编辑任何代码 我正在使用 Maven 和 jetty 构建并运行 Web 应用程序 当我执行
  • 使用 javascript 自动增加 firebase 中的值

    你好 我正在开发一些 firebase 项目 我可以通过 javascript 将我的数据保存到 firebase 数据库中 但我无法弄清楚如何自动增加数据库的子值 我的子值是 duyuru 您可以在下面看到详细信息 我在下面分享我的代码
  • 如何使用 Groovy 修剪列表中的所有元素?

    我需要在 groovy 或 grails 中修剪列表中的所有元素 最好的解决方案是什么 假设它是一个字符串列表 并且您想要修剪每个字符串 您可以使用扩展运算符 http groovy codehaus org Operators Opera
  • 从数组随机 URL 重定向

    政治动物 contentscript js 加载到清单 json 中列出的每个页面上 该插件将新闻网站网站上的所有图像替换为以下图片 穿西装的动物 作为对新闻的评论 专为 Web 2 打造 2013 年 11 月 20 日 随机图像数组 v
  • 以编程方式将 TabLayout 中的选项卡文本颜色更改为不同颜色

    我的屏幕上有 7 个日期选项卡 选择选项卡时 文本为黑色 而其他可选选项卡的颜色为白色 如果日期是另一个月 我希望文本颜色为灰色 我假设第一个选项卡是 0 第二个选项卡是 1 一直持续到 6 如图所示 我想更改选项卡 3 选项卡 4 选项卡
  • Activity 恢复时的 Android 内部类 TextView 参考

    我有一个扩展 CountDownTimer 的内部类 基本上它是一个简单的倒计时器 用于更新活动中的 TextView 并在计时器完成时播放声音 内部类的代码是 public class SetTimer extends CountDown
  • Python 3.2 有等效的 PyMongo 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试安装pymongo通过 Python 3 2 到我的 Windows 机器简易安装 却发现由于与Python 3 2不兼容而无法安装
  • 什么是 std::false_type 或 std::true_type?

    我看到它的用法如下 template
  • 何时使用 RecoveryCallback 与 KafkaListenerErrorHandler

    我想了解什么时候应该使用 org springframework retry RecoveryCallback 和 org springframework kafka listener KafkaListenerErrorHandler 截
  • 减少 Docker 容器大小

    我正在关注有关 Docker 的在线教程 作者举了这样一个例子 FROM busybox RUN dd if dev zero of tmp test1 bs 1M count 50 RUN dd if dev zero of tmp te
  • 引用对象的 OQL 语法?

    我在中找到所需的对象visualvm v1 3 8 filter heap objects java lang String hibernate ejb naming it toString 它们显示为 java lang String 3
  • 查询Google/Youtube API剩余配额

    有没有办法通过 Google Youtube API 以编程方式查询当天的剩余配额 None
  • 如何将 CMake 输出保存到文件?

    我通常可以通过以下方式保存 bash 命令的输出 gt gt output file txt 但是当我执行时cmake输出仍然发送到屏幕而不是预期的输出文件 cmake D CMAKE BUILD TYPE RELEASE D CMAKE
  • 如何在Javascript中确定数字是奇数还是偶数[重复]

    这个问题在这里已经有答案了 谁能指点我一些代码来确定 JavaScript 中的数字是偶数还是奇数 我正在尝试做类似的事情 if intellect is even var magic1 intellect 2 else var magic
  • 设计基于 Firebase 的可扩展 Feed 模型

    问题 如何设计一个以 Firebase 作为后端 可扩展的社交网络 提要 可能的答案 MVP 解决方案是设计一个feedsroot 子级 每个用户一个 并在每个关注者的提要中附加来自关注用户的任何新帖子 users user1 name b