【问题标题】:Process queue of API requests concurrently with同时处理 API 请求队列
【发布时间】:2014-02-19 12:18:18
【问题描述】:

我们目前的 API 主要接受两种类型的请求:一种用于识别用户详细信息,另一种用于跟踪他们执行的事件。它当前处理请求中的所有逻辑。我们有两个应用程序框,因此可以同时处理具有有效相同数据的两个识别请求。虽然在性能方面,这个解决方案在当前规模上很好,但我们已经看到了并发问题。

我的问题是:我们如何处理一个 api 请求队列,以便与一个人相关的请求在单个工作人员中按顺序完成?

我们的堆栈是基于 MongoDB 的 Ruby,我非常乐意探索其他技术,但显然任何利用我们当前堆栈的解决方案都是一个优势。

我考虑过锁定人员记录,但不知道检查锁定的方法,如果空闲,则将其锁定在一个操作中,这样两个线程就不可能在同时,以为他们都有,但实际上只有一个。

我目前的想法(对消息队列的经验非常有限)是将请求排队,然后使用一致的哈希交换来确保对一个人的请求总是路由到同一个工作人员。但是阅读文档,看起来一致的哈希交换实际上是为了帮助在工作人员之间分配任务,而不是按某个属性对它们进行分组。

【问题讨论】:

    标签: ruby multithreading mongodb concurrency message-queue


    【解决方案1】:

    您可以使用 redis 进行锁定。 redis-objects 有它的原语。这是一个较低级别的版本:https://github.com/PatrickTulskie/redis-lock

    过去对我来说效果很好。

    【讨论】:

    • 感谢这正是我一直在寻找的关于锁定的东西
    【解决方案2】:

    任何特定的基于散列的逻辑/分配将自动具有始终路由到同一个队列的属性,前提是键没有改变并且队列没有改变。因此,提供相同数量的存储桶和相同的密钥,它应该被路由到相同的存储桶。

    从一致哈希交换的快速浏览来看,该主体是完整的。主要目标可能是将负载分配到队列上,但保留唯一/一致路由的次要属性作为其中的一部分。

    如果负载分配是唯一目标,则不需要密钥,负载也可以循环分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多