Я работаю над несколькими проектами, которые иногда общаются друг с другом, и я столкнулся с проблемой, когда приложение

  1. A вызывает B (request 1, все еще работает)
  2. B вызывает A (request 2)
  3. на основании результата request 2 B отвечает на запрос 1

Для этого мне нужно запустить многопоточные рельсы в режиме разработки.

Я знаю, что могу настроить это с помощью puma или чего-то в этом роде, но ... Неужели нет более простого способа?

Я бы не хотел ничего менять в проекте (добавлять гемы, файлы конфигурации ..).

Что-то вроде rails s --multi было бы неплохо, не может ли webrick просто работать с несколькими потоками или порождать больше процессов?

Могу ли я установить автономный гем, чтобы делать то, что мне нужно, и запускать что-то вроде thin run . -p 3?

7
hakunin 25 Июл 2017 в 21:29

3 ответа

Веб-сервер puma может обеспечивать многопоточность и несколько рабочих процессов, привязанных к одному локальному адресу.

  1. Установите жемчужину пумы:

    bundle add puma
    

    или

    gem install puma
    
  2. Добавьте файл конфигурации puma в config/puma.rb:

    workers 1 # 1 worker in addition to master instance (i.e. handle 2 requests concurrently).
    preload_app!
    
  3. Запустите сервер Rails.

    bundle exec rails s
    

    Puma автоматически запускается и загружает файл конфигурации по адресу config/puma.rb.

Увеличьте значение для workers, если вам нужно обрабатывать более двух одновременных запросов одновременно.

6
Joshua Pinter 20 Авг 2019 в 05:27
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
 – 
Alex Riabov
4 Окт 2018 в 01:37
1
А с Rails 5 Puma должен быть сервером по умолчанию, поэтому для тех, кто его использует, проблема, которую я описываю, перестает существовать.
 – 
hakunin
4 Окт 2018 в 10:14

Один из способов решить эту проблему - использовать POW, который по умолчанию использует двух рабочих процессов.

Приятно то, что мне не нужно изменять файлы проекта, чтобы это соответствовало моим требованиям.

2
hakunin 26 Июл 2017 в 09:49

Мое текущее решение, которое очень сложно, состоит в том, чтобы использовать Foreman и Procfile для запуска двух копий моего приложения. на разные порты. Вам нужно будет настроить службу B для отправки запросов на вторичный порт.

1
drewish 3 Окт 2017 в 19:22