【问题标题】:Updating client after processing task in queue处理队列中的任务后更新客户端
【发布时间】:2017-02-12 00:50:07
【问题描述】:

Firebase 客户端可以像这样将任务添加到队列中:

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

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

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

我们是否应该在登录用户模型上使用一个属性,让客户端监听更改?

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

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

【问题讨论】:

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


    【解决方案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()))"
        }
      }
    }
    

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

    为确保客户端只能在启动状态添加条目,您需要在上面的规则中填写&lt;start state goes here&gt;

    规格

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

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

    其他注意事项

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

    【讨论】:

      【解决方案2】:

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

      所以:

      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

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 2021-03-01
        • 1970-01-01
        • 2018-06-10
        相关资源
        最近更新 更多