我有一个使用firebase和node.js的聊天应用程序,我通过在服务器上运行单个工作线程跟踪存在,该线程监视firebase存在通道上的child_added和child_deleted事件,并相应地更新我们的状态数据库表。 / p>
我的问题是 - 现在firebase队列存在https://www.firebase.com/blog/2015-05-15-introducing-firebase-queue.html
我可以使用队列替换我在服务器上运行的工作线程来监控presence和child_added事件吗?查看当前的示例 - 看起来我会在客户端上创建对队列的引用,然后设置断开连接并连接事件以从客户端推入该队列?但是,我想更多地保护它,而不是如此依赖客户端。我还想让队列通过将事件存档到第三方日志记录服务来处理事件 - 我不希望向客户端公开的凭据或详细信息。
这是否意味着我仍然需要服务器端工作进程 - 如果是这样,firebase队列在这个用例中有什么好处?
答案 0 :(得分:4)
Firebase队列不是托管解决方案 - 您仍需要在自己的服务器上运行它。
在单个侦听器进程上使用队列的主要优点是能够为同一任务运行多个工作程序,因此没有单点故障。使用队列,您将知道工作进程是同步的,只有一个工作人员将在任何一个时间点处理任务,如果工作人员在处理过程中死亡或需要太长时间,另一个工作人员将再次接收它任务已超时。
听起来您正在尝试为状态创建某种审计跟踪,但目前无法直接从服务器报告状态 - 您需要在某个时候依赖客户端。您的安全规则可以强制执行写入是否是数据库中特定位置的布尔值,但是在编写时,它们无法强制客户端处于任何特定的状态。另请注意,没有push
或childByAutoId
等效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,因此在添加到队列时,任务不一定是有序的。