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

时间:2016-10-04 00:20:57

标签: node.js firebase firebase-realtime-database firebase-queue

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

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

此任务表示获取商品报价的请求。

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

我们是否应该在登录用户模型中使用属性,客户端是否为其监听更改?

登录用户可以监听自己模型的更改,然后更改会获得报价数据吗?

除登录用户模型本身外,或许在数据库中使用其他模型?

2 个答案:

答案 0 :(得分: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
    }
});

另见:Return task results using firebase-queue

答案 1 :(得分:1)

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

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

<start state goes here>

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

要确保客户端只能在开始状态中添加条目,您需要在上面的规则中填写{ "error_state" : "error", "finished_state" : "finished", "in_progress_state" : "in_progress" }

规格

{{1}}

您需要一个非默认规范来指定已完成状态,客户端可能会查看该状态以了解请求何时解析。

其他注意事项

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