为什么 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
我有以下 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