【问题标题】:how to build a presence system with the new firebase queue如何使用新的 firebase 队列构建存在系统
【发布时间】:2015-09-14 17:17:04
【问题描述】:

我有一个使用 firebase 和 node.js 的聊天应用程序,在该应用程序中,我通过在服务器上运行单个工作线程来跟踪存在情况,该工作线程监控 firebase 存在通道上的 child_added 和 child_deleted 事件,并相应地更新我们的存在数据库表。

我的问题是这个 - 现在 firebase 队列存在 https://www.firebase.com/blog/2015-05-15-introducing-firebase-queue.html

我可以使用队列来替换我在服务器上运行的工作线程来监控存在和 child_added 事件吗?查看当前示例 - 看起来我会在客户端上创建对队列的引用,然后设置断开连接和连接事件以从客户端推送到该队列?但是,我想对其进行更多保护,而不是过多地依赖客户端。我还希望队列通过将事件归档到第 3 方日志记录服务来处理事件 - 我不想向客户端公开凭据或详细信息。

这是否意味着我仍然需要一个服务器端工作进程 - 如果需要,firebase 队列在这个用例中会有什么好处?

【问题讨论】:

    标签: firebase


    【解决方案1】:

    Firebase Queue 不是托管解决方案 - 您仍然需要在自己的服务器上运行它。

    在单个侦听器进程上使用队列的主要优点是能够为相同的任务运行多个工作器,因此不会出现单点故障。使用队列,您会知道工作进程是同步的,因此在任何一个时间点只有一个工作人员正在处理任务,如果一个工作人员在处理过程中死亡或花费时间过长,另一个工作人员将再次拿起它一次任务已超时。

    听起来您正在尝试为存在创建某种审计跟踪,但目前无法直接从服务器报告存在 - 在某些时候您需要依赖客户端。您的安全规则可以强制写入是否是对数据库中特定位置的布尔值,但它们不能强制客户端在写入时处于任何特定的存在状态。另请注意,没有 pushchildByAutoId 等效的 onDisconnect 处理程序,因此要推送到队列,您必须执行以下操作:

    var ref = new Firebase(…);
    var disconnectTask = {};
    var pushId = ref.push().key(); // This just generates the ID and does no network traffic
    disconnectTask[pushId] = {  /* populate with task data here */ };
    ref.onDisconnect().update(disconnectTask);
    

    请注意,推送 ID 将在操作发送到服务器之前在客户端生成,因此添加到队列时任务不一定按顺序排列。

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2011-05-04
      • 2021-01-05
      • 2017-03-16
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多