为什么 puma webserver 在一次有多个请求的情况下开发失败?

Why puma webserver fails in development with multiple requests at a time?

我有以下 puma-config:

workers 0 # single mode

threads_count = 2
threads threads_count, threads_count

rackup DefaultRackup
port 3200
environment ENV["RACK_ENV"]

on_worker_boot do
  App.stop(:orm)
end
Puma starting in single mode...
* Puma version: 5.3.2 (ruby 2.7.0-p0) ("Sweetnighter")
*  Min threads: 2
*  Max threads: 2
*  Environment: development
*          PID: 286

后端是一个简单的 ruby GraphQL-API。我有一个反应前端。 如果前端一次请求多个请求,则并非所有请求都得到正确处理。前端会出现这种奇怪的故障,因为响应只是部分到达。

SyntaxError: JSON.parse: unterminated string at line 1 column 91 of the JSON data

似乎服务器在新请求进入时中止了请求。

如果我将 thread_count 设置为 1

threads_count = 1

没有错误,请求按顺序处理。

这是怎么回事?

谢谢

如果你仔细阅读我的问题,你会发现几个指向并发问题的线索。

threads_count = 2

If the frontend requests multiple requests at a time, not all requests are processed properly

If I set the thread_count to 1, there's no error

当时,我没有看到那些线索,也不知道发生了什么;)。往往只见树木不见森林

@Myst 可以看到线索并为我指出正确的方向。

我的 API 使用了很棒的 hanami-api,控制器是 hanami-controllers (1.3)。这是一个 code-snippet,其中包括 concurrency-bug:

class MyAPI < Hanami::API
  scope "api" do
    scope "graphql" do
      post "endpoint", to: App["controllers.graphql.endpoint"]
    end
  end
end

然后我在文档中找到了这段有用的文字:

An Action is mutable. When used without Hanami::Router, be sure to instantiate an action for each request. The same advice applies when using Hanami::Router but NOT routing to mycontroller#myaction but instead routing direct to a class.

同时,已经有 hanami-controller 2.x,它们是 thread-safe 设计的。

但就我而言,我必须将我的代码修改为:

class MyAPI < Hanami::API
  scope "api" do
    scope "graphql" do
      post "endpoint",  to: ->(env) { App["controllers.graphql.endpoint"].call(env) }
    end
  end
end