【问题标题】:How can I create a queue with multiple workers?如何创建具有多个工作人员的队列?
【发布时间】:2012-06-30 04:14:52
【问题描述】:

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

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

考虑到安全和验证工具,下面是一个简单的例子来说明我的想法:

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

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

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

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

其他一些用法示例:

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

所以问题是:

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

【问题讨论】:

    标签: firebase


    【解决方案1】:

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

    身份验证

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

    负载均衡的工作队列

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

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

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

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

    【讨论】:

    • @Michael_Lehenbauer 感谢您的精彩解释。我很高兴听到身份验证选项的多样性——听起来很棒。
    • 随机工作队列的想法很有趣;我想如果服务器离线,这会造成一些难题。我想如果服务器离线,我们可以删除队列,并让客户端负责跟踪他们的请求并将其委托给新服务器。
    • @Kato 我已经查看了您的 firebase 队列库,但不确定它是否在这里回答了我的问题:stackoverflow.com/questions/41979438/…。你有什么解决办法吗?
    【解决方案2】:

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

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

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

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

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

    答:嗯,这就是 Firebase Queue 为您做的事情!

    参考资料:

    【讨论】:

    • 这一切具有讽刺意味的是,firebase-queue 是我帮助其他人构建的几年迭代的最终结果,这是我对自己问题的原始答案的结果。看到你发这个感觉就像进入了某种时间连续体。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多