2012-06-28 84 views
8

我想创建一个客户端可以放入请求的队列,然后服务器工作线程可以在有可用资源时将其拉出。如何创建一个有多个工作人员的队列?

我在探索如何使用Firebase存储库执行此操作,而不是使用外部队列服务,然后必须将数据注入Firebase。

考虑到安全性和验证工具,这里是什么,我心里有一个简单的例子:

  • 用户按下请求转换为“排队”斗
  • 服务器拉出请求,并删除它(如何确保只有一台服务器收到请求?
  • 服务器验证的数据,并从私人桶检索(或注入新的数据)
  • 服务器推出数据和/或错误返回给用户的桶

enter image description here

的情况可能是将认证有用的一个简单的例子:

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

(当然还有在公共队列一些安全漏洞;我只是探索在这一点上)

一些其他的例子为使用:

  • 只读状态队列(用户状态通过专用水桶相通,它的服务器写入的一个公共斗这是只读对于公众)
  • 消息队列(消息通过用户发送,服务器决定其讨论水桶它们会落入)

所以问题是:

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

回答

8

哇,很好的问题。这是我们在内部讨论过的一种使用模式,所以我们很想听听您实施它的经验([email protected])。这里有一些想法在你的问题:

认证

如果你的主要目标其实是认证了,就等着我们的安全功能。 :-)特别是,我们打算有能力通过自己的后端服务器进行auth支持,由firebase用户商店提供支持,或由第三方提供商(Facebook,Twitter等)支持。

负载平衡工作队列

不管权威性的,还是有一个有趣的用例使用火力地堡为骨干某种工作负载平衡系统,像你描述。为此,有几个方法,你可以采取:

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

就我个人而言,如果您想要获得最佳性能,我会倾向选项#2。但#1可能会更容易进行原型设计,至少在最初阶段就会好起来。

总的来说,你的设计绝对是正确的。如果您尝试实施并遇到问题或对我们的API有任何建议,请告诉我们([email protected] :-)!

+0

@Michael_Lehenbauer感谢你的很好的解释。我很高兴听到有关身份验证选项的多样性 - 听起来不错。 – Kato

+0

随机工作队列的想法很有趣;如果服务器脱机,我想它会造成一些难题。我想我们可以在服务器掉线的情况下删除队列,并让客户端负责跟踪他们的请求并将其委派给新的服务器。 – Kato

+0

@Kato我检查了你的firebase队列库,但不知道它是否回答我的问题在这里:http://stackoverflow.com/questions/41979438/are-there-any-solution-support-this-single-concurrency-distributed - 队列。你有没有想过任何解决方案? – DucDigital

3

这个问题是很老的,但万一有人让在这里反正...

自2015年中期火力地堡提供一种叫Firebase Queue,容错多工人的工作管道建在火力地堡。

问:这是一个很好的设计,可以很好地整合到即将到来的安全计划中吗?

答:您的设计建议与Firebase队列完全吻合。

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

A:好吧,那几乎是Firebase Queue为您做的!

参考文献:

+2

所有这些的具有讽刺意味的部分是,firebase-queue是我帮助其他人构建的几年迭代的最终结果,这是我对自己问题的原始答案的结果。看到你发布这个感觉就像进入某种时间连续体一样。 :) – Kato

相关问题