feeeei

Rails 在 development 环境启动多份
这两天在开发时,遇到一个需求是创建订单 Order 之后,自动下载预订单附件上传到图床。因为开发环境默认只有一个进...
扫描右侧二维码阅读全文
04
2018/08

Rails 在 development 环境启动多份

这两天在开发时,遇到一个需求是创建订单 Order 之后,自动下载预订单附件上传到图床。

因为开发环境默认只有一个进程运行,第一个进程请求项目里面的另一个页面会因为单进程卡死。这个问题在生产环境当然不会发生,因为生产环境容器一定是多进程在运行的,但是开发环境遇到这个问题,第一次遇到这种问题,一时不知道该如何测试解决。想了想,找到了两个解决方案。

1. 修改 development 环境中间件 workers 数量

比如在 Rails5 中,默认本地环境已经是在使用 puma 在运行了,我们可以直接改 puma 中的 workers 数量来直接支持多进程。

路径:project_path/config/puma.rb
修改:

......
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
......

我们可以直接改为2或者更多,重启 rails server 会发现已经是多 workers 版本运行了。

=> Booting Puma
=> Rails 5.1.5 application starting in development
=> Run `rails server -h` for more startup options
[16108] Puma starting in cluster mode...
[16108] * Version 3.11.2 (ruby 2.5.0-p0), codename: Love Song
[16108] * Min threads: 5, max threads: 5
[16108] * Environment: development
[16108] * Process workers: 2
[16108] * Phased restart available
[16108] * Listening on tcp://0.0.0.0:3000
[16108] Use Ctrl-C to stop
[16108] - Worker 0 (pid: 16137) booted, phase: 0
[16108] - Worker 1 (pid: 16138) booted, phase: 0

但是这样会有一个问题,如果在其中打断点,其中一个进程进入断点后,另一个进程依旧在运行,两个进程的日志都输出到同一个终端中,终端中的日志会很乱。

2.修改 server 默认端口,启动多个实例

这个方案的思路是,我们可以先启动一个3000端口的 server,再启动一个别的端口的 server,这样的优点在于,每个终端中只运行一个单进程实例,可以保证终端中的内容一定是相关的。但是在启动第二个服务时会提示 pid 冲突:A server is already running. Check ~/project_name/tmp/pids/server.pid.
查阅文档后发现,rails 真的省心... 还有一个 -P 参数来指定 pid。

rails server -p 3001 -P 30001

输出:

=> Booting Puma
=> Rails 5.1.5 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.2 (ruby 2.5.0-p0), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3001
Use Ctrl-C to stop

搞定。

Last modification:August 12th, 2018 at 03:33 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment