1

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

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

此任务表示获取项目报价的请求。

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

我们应该在登录用户模型上使用一个属性,让客户端监听变化吗?

登录的用户可以在自己的模型上监听变化,然后在变化时会得到报价数据?

除了登录用户模型本身之外,也许在数据库中使用另一个模型?

4

2 回答 2

1

我们目前通过使用队列的功能来处理响应来做到这一点。安全规则强制用户将其用户 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()))"
    }
  }
}

这允许客户端创建新作业和删除作业,但不能修改其内容。

为确保客户端只能在开始状态添加条目,您需要填写<start state goes here>上述规则。

规格

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

您需要一个非默认规范来指定完成状态,客户端可以观察该状态以了解请求何时得到解决。

其他注意事项

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

于 2016-10-24T20:45:41.223 回答
1

我会在任务中放置一个唯一标识符,然后您可以将其写入响应“队列”(此时它实际上更像是一个列表)。

所以:

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-queue 返回任务结果

于 2016-10-04T01:58:14.833 回答