在队列中处理任务后更新客户端

Firebase客户端可以将任务添加到队列中,如下所示:

var tasks = db.ref('quote-request-queue/tasks'); tasks.push({'need': 'quote for customer'}); 

这个任务代表一个请求得到一个项目的报价。

在后端,Firebase队列工作人员将完成任务并完成一些工作,但在后端工作完成后更新客户端的规范方式是什么?

我们是否应该使用login用户模型中的一个属性,为此客户端监听更改?

login的用户可以监听自己的模型的变化,然后更改将获得报价数据?

除了已login的用户模型本身之外,也许还可以在DB中使用另一个模型?

我会在任务中添加一个唯一的标识符,然后写入响应“队列”(这实际上更像是一个列表)。

所以:

 var tasks = db.ref('quote-request-queue/tasks'); var key = tasks.push().key; tasks.push({'need': 'quote for customer', id: key }); 

然后服务器将其响应写入:

 quote-responses <key> 

客户在那里等待回应:

 var responses = db.ref('quote-responses').child(key); responses.on('value', function(snapshot) { if (snapshot.exists()) { // TODO: handle the response in the snapshot } }); 

另请参阅: 使用firebase队列返回任务结果

我们目前通过使用队列的function来处理响应。 用户被安全规则强制将他们的用户ID写为请求的属性,他们可能只读取队列中包含其ID的项目。

安全规则(客户的相关部分):

 "queue": { "tasks": { ".indexOn": [ "_state" ], "$id": { ".read": "auth !== null && ((!data.exists()) || (data.child('user').val() === auth.uid))", ".write": "auth !== null && ((!data.exists() && newData.child('user').val() === auth.uid && newData.child('_state').val() === '<start state goes here>') || (data.exists() && data.child('user').val() === auth.uid && !newData.exists()))" } } } 

这允许客户创build新的作业和删除作业,但不能修改他们的内容。

为了确保客户端只能在开始状态下添加一个条目,您需要在上面的规则中填写<start state goes here>

规格

 { "error_state" : "error", "finished_state" : "finished", "in_progress_state" : "in_progress" } 

您需要一个非默认规范来指定一个完成状态,客户端可能会注意知道请求何时解决。

其他考虑因素

不能依赖客户来清理这样的任务。 您应该configuration服务器在超时后自动删除响应。 例如,用户可能在返回响应之前刷新或离开页面。 这可能只发生在不到1%的时间,但如果队列填满了响应,那么性能就会下降。