Рубиновые микросервисы - как перезапустить / возродиться в производстве - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я нахожусь в процессе переноса некоторых функций Rails в некоторые микросервисы, я не буду утомлять вас причинами этого, достаточно сказать, что мы довольны решением и нашими архитектурными решениями.

На данный момент это не особенно сложно, работает несколько автономных скриптов, говорящих через rabbitMQ, все с несколькими гем-зависимостями (bunny, mysql2 и т. Д.), Когда я запускаю их через CLI, все прекрасно работает.

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

Наша текущая платформа выглядит следующим образом:

Centos 6,5 (не спрашивайте) RVM 2.5.1@somegemset Nginx пассажир someuser

Для Rails я использую Capistrano с плагинами RVM и Bundler, и он запускается и забывает, все развертывается, если падает, перезапускается и мы уходим.

Первоначально я думал, что могу просто добавить каждый рубиновый микросервис в каталог init с помощью респауна. Но работа никогда не начнется.

Если я подключаюсь как другой пользователь (не пользователь rails), у меня возникают проблемы с gem / rvm. Поэтому я подумал, что это может быть проблема с путём, пытаясь решить её, я подумал, что мы можем потерять rvm и пойти с установкой пакета --binstubs.

Это работает из командной строки, например. service_directory / bin / bundle exec service.rb

но все еще не работает в init, они просто не запускаются, начиная со статуса 42 (?), Вот мой init init.

start on runlevel [2345]
stop on starting shutdown

respawn

exec /home/someuser/services/some-service/bin/bundle exec /home/someuser/services/some-service/lib/service.rb

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

Я пытался использовать мастер, отлично работает с запуском мастера, но созданные сценарии экспорта выскочки не работают таким же образом.

Я пытался сделать их исполняемыми с оболочкой rvm ruby ​​в качестве шебанга, сценарии включают

require 'rubygems'
require 'bundler/setup'

Я читал о monit, но, похоже, нужны pids, которые не создаются в моих скриптах.

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

Заранее спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

Для будущего меня и всех, кто считает это полезным.

Я решил это, используя драгоценный камень. Выскочивший сценарий был все еще огромной болью, я не мог заставить его работать так, как мне бы хотелось, но мне удалось заставить его работать, используя обертки RVM.

Окончательный сценарий выскочки выглядит следующим образом. Важно, чтобы я не пытался загрузить несколько конфигов богов, используя * .god, но это загрузило бы только первый. В конце я просто поместил каждый блок конфигурации в один файл, как рекомендовано в другом месте, что привело нас в игру.

/home/someuser/.rvm/wrappers/ruby-2.5.1@agemset/god -D -P / var / run / god --log /var/log/god.log -c / home / someuser / услуги / master.god

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

Если бог умирает, дочерние сценарии не умирают, что немного неприятно. Я подозреваю, что есть способ убить службы, но это на другой день.

Это, по крайней мере, положит начало процессу бога при перезагрузке, и Бог позаботится о том, чтобы службы были активны.

...