如何使用新的 firebase 队列构建在线系统

how to build a presence system with the new firebase queue

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

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

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

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

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

与单个侦听器进程相比,使用队列的主要优点是能够 运行 多个工作人员执行相同的任务,因此不会出现单点故障。使用队列你会知道 worker 进程是同步的,这样在任何一个时间点只有一个 worker 会处理一个任务,如果一个 worker 在处理过程中死了或者耗时太长,另一个 worker 会重新接一次任务超时。

听起来您正在尝试为在线状态创建某种审计跟踪,但目前无法直接从服务器报告在线状态 - 您有时需要依赖客户端。您的安全规则可以强制写入是否是数据库中特定位置的布尔值,但它们不能强制客户端在写入时处于任何特定的存在状态。另请注意,没有 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 将在操作发送到服务器之前在客户端生成,因此任务在添加到队列时不一定按顺序排列。