8

我想创建一个队列,客户端可以在其中放入请求,然后服务器工作线程可以将它们拉出,因为它们有可用的资源。

我正在探索如何使用 Firebase 存储库来做到这一点,而不是使用外部队列服务,然后必须将数据注入 Firebase。

考虑到安全性和验证工具,这里有一个简单的例子来说明我的想法:

  • 用户将请求推送到“队列”存储桶中
  • 服务器拉出请求并将其删除(如何确保只有一台服务器收到请求?
  • 服务器验证数据并从私有存储桶中检索(或注入新数据)
  • 服务器将数据和/或错误推送回用户的存储桶

在此处输入图像描述

一个可能有用的简化示例是身份验证:

  • 用户将身份验证请求放入公共队列
  • 他的登录名/密码进入他的私人存储桶(只有他可以读/写的地方)
  • 服务器获取身份验证请求,检索登录名/密码,并针对只有服务器可以访问的私有存储桶进行验证
  • 服务器将令牌推送到用户的私有存储桶中

(当然,公共队列中仍然存在一些安全漏洞;我现在只是在探索)

其他一些使用示例:

  • 只读状态队列(用户状态通过私有存储桶进行通信,服务器将其写入公共存储桶,该存储桶对公众只读)
  • 消息队列(消息通过用户发送,服务器决定将它们放入哪些讨论桶)

所以问题是:

  1. 这是一个很好的设计,可以很好地集成到即将到来的安全计划中吗?正在探索哪些替代方法?
  2. 如何让所有服务器监听队列,但只有一个服务器来接收每个请求?
4

2 回答 2

8

哇,好问题。这是我们在内部讨论过的一种使用模式,因此我们很想听听您实施它的经验 (support@firebase.com)。以下是对您的问题的一些想法:

验证

如果您的主要目标实际上是身份验证,请等待我们的安全功能。:-) 特别是,我们希望能够在您自己的后端服务器、firebase 用户存储或第三方提供商(Facebook、twitter 等)的支持下进行身份验证。

负载均衡的工作队列

无论身份验证如何,使用 Firebase 作为您所描述的某种工作负载平衡系统的主干仍然有一个有趣的用例。为此,您可以采取以下几种方法:

  1. 正如您所描述的,有一个工作队列,您的所有服务器都可以从中监视和删除项目。您可以使用事务来完成此操作() 删除项目。transaction() 处理冲突,因此只有一个服务器的事务会成功。如果一个服务器在工作项上击败第二台服务器,第二台服务器可以中止其事务并再次尝试队列中的下一个项目。这种方法很好,因为它会在您添加和删除服务器时自动扩展,但是每次事务尝试都会产生开销,因为它必须往返于 firebase 服务器以确保没有其他人已经从队列中获取该项目。但是,如果处理一个工作项所花费的时间远大于往返于 Firebase 服务器的时间,那么这种开销可能并不是什么大问题。如果您有很多服务器(即更多的争用)和/或很多小工作项,那么开销可能是一个杀手。
  2. 通过让客户端在多个工作队列中随机选择来将负载平衡推送到客户端。(例如有/queue/0、/queue/1、/queue/2、/queue/3,并让客户端随机选择一个)。然后每个服务器可以监控一个工作队列并拥有所有处理。一般来说,这将具有最少的开销,但是当您添加/删除服务器时它不会无缝扩展(您可能需要保留一个单独的工作队列列表,服务器在它们上线时会更新,然后有客户端监控列表,以便他们知道有多少队列可供选择,等等)。

就个人而言,如果您想要最佳性能,我会倾向于选项 #2。但是#1可能更容易进行原型设计并且至少在最初是可以的。

一般来说,您的设计绝对是在正确的轨道上。如果您尝试实施并遇到问题或对我们的 API 有建议,请告诉我们 (support@firebase.com :-)!

于 2012-06-28T18:25:19.643 回答
3

这个问题已经很老了,但万一有人在这里提出......

自 2015 年年中以来,Firebase 提供了一种称为Firebase Queue的东西,这是一个基于 Firebase 构建的容错多工作者作业管道。

问:这是一个很好的设计,可以很好地集成到即将推出的安全计划中吗?

答:您的设计建议非常适合 Firebase Queue。

问:如何让所有服务器都监听队列,但每个请求只有一个接收?

答:嗯,这几乎就是 Firebase Queue 为您所做的!

参考:

于 2016-03-23T20:00:04.083 回答