Rails - 美洲狮工人的并发问题

Rails - Concurrency issue with puma workers

我有一个 Puma 服务器配置为使用两个工作线程,每个工作线程有 16 个线程。并禁用 config.threadsafe! 以允许使用 puma 进行线程处理。

现在我有一个代码,我怀疑它没有使用线程安全,即使我在那里使用 Mutex 作为常量。我希望这段代码一次只由一个 puma 线程执行以避免并发问题,并为此使用 Mutex

现在,我的问题是,

  1. Mutex 是否可以在使用 puma 线程时在多个 worker 上注入线程安全?据我了解,worker 是一个单独的进程,因此 Mutex 将不起作用。
  2. 如果 Mutex 不能按上述方式工作,那么在特定代码上启用线程安全的解决方案是什么?

代码示例

class MyService
  ...
  MUTEX = Mutex.new     
  ...

  def initialize
   ...
  end

  def doTask
    MUTEX.synchronize do
      ...
    end
  end
end

MUTEX 对我不起作用,所以我需要找到另一种方法。请参阅下面的解决方案。

问题是,差异。 puma 线程同时向外部远程 API 发出请求,有时远程 API 需要时间来响应。

我想限制 API 请求的总数,但由于上述问题无法正常工作。

要解决此问题,

  • 我创建了一个数据库 table,当请求发送到外部 API 时,我将在其中创建一个新条目 in-pogress
  • 一旦 API 回复,我会将条目更新为 processed
  • 在向外部 API 发出任何新请求之前,我正在检查具有 in-progress 的请求总数。

这样,我就可以限制从我的系统到外部的请求总数 API。