В предыдущий информационный бюллетеньИсмаэль объяснил вам, что Sidekiq очень полезен для освобождения сервера приложений от всех задач, не требующих немедленной обратной связи с пользователем (отправка электронных писем, изменение состояния, обработка перехватчиков и т. д.).
Массовое и централизованное использование такого инструмента, как Sidekiq, в наших приложениях требует от нас знания того, как он работает.
Сегодня мы сосредоточимся на «сигналах», на том, как их интерпретирует Sidekiq, и я представлю вам случай, который может вызвать очень (очень очень похожие на donkey trotro) проблемные ошибки и как их избежать.
В программе сегодня:
Время чтения : 5 минут
Привет, маленькие Печеньки!
Добро пожаловать в 19-й выпуск Ruby Biscuit.
У вас теперь 445 подписчиков 🥳
Вот 2 объявления которые могут вас заинтересовать, чтобы сделать ваше 22 марта прибыльным 😉:
-
Le Wagon Paris организует ярмарку вакансий, которая пройдет через две недели в Пятница 22 марта. Если вы рекрутер и ищете технические профили (младший разработчик, данные и продукт) для расширения своей команды, вы можете зарегистрироваться здесь !
-
React Paris: важная конференция, посвященная последним достижениям в React! Посетите конференцию React Paris, мероприятие, которое нельзя пропустить в Париже, и онлайн на 22 марта ! В программе: последние достижения в экосистеме React с увлекательными презентациями о серверных компонентах React, искусственном интеллекте, доступности, дизайне, производительности, Remix, TypeScript и многом другом! Не упустите возможность учиться и общаться с экспертами, авторами и ключевыми членами команды, а также с активным сообществом разработчиков. Вы можете зарезервировать место на этот исключительный день на https://react.paris !
Прежде чем оставить вас в руках Квентина для написания статьи в этом месяце, я хотел бы напомнить вам, что вы все можете высказать свое мнение в комментариях и поделиться своим опытом по темам, которые мы рассматриваем. Вы также можете поставить лайк ❤️ и/или поделиться новостной рассылкой с другом! 😉
Хорошее чтение.
Здесь я просто беру определения из Интернета, а также ссылки, чтобы идти дальше.
Сигнал: Форма связи между процессами, используемыми Unix-подобными системами и процессами, соблюдающими стандарты POSIX. Это асинхронное уведомление, отправляемое процессу, чтобы уведомить его о возникновении события.
TL;DR Ctrl-c dans le terminal execute le signal SIGINT sur votre programme
https://fr.wikipedia.org/wiki/Signal_(informatique)
Грациозная остановка: Метод остановки программы, позволяющий указанной программе выполнять текущие задачи, не принимая новых.
Идемпотентность: означает, что операция имеет одинаковый эффект, независимо от того, применяется ли она один или несколько раз
https://fr.wikipedia.org/wiki/Идемпотенс
Sidekiq — это процесс, независимый от вашего сервера Rails. Обычно он запускается командой
bundle exec sidekiq -C config/sidekiq.yml # + des options si besoin
Чтобы обеспечить четкое управление своей работой, Sidekiq реализует определенные сигналы, позволяющие gracefull stop
.
Подробный список можно найти здесь и сегодня мы собираемся сосредоточиться более конкретно на TSTP
и др. TERM
. Sidekiq также реализует сигнал TTIN
но это полезно только для отладки.
ТСТП:
Сигнал, приказывающий Sidekiq больше не принимать никаких вакансий. Таким образом, ваши задания останутся в очереди Redis, ожидая запуска нового процесса. Процесс Sidekiq будет помечен как quiet
.
СРОК :
Сигнал, который приказывает Sidekiq остановиться в течение определенного времени (по умолчанию 25 секунд, настраивается с помощью опции -t
). Под этим действием процесс немедленно переходит в quiet
точно так же, как это делает сигнал TSTP
.
По истечении срока любая незавершенная работа будет немедленно остановлена независимо от выполняемых действий и именно здесь могут возникнуть проблемы 😱.
В идеале иметь короткую и идемпотентную работу, и это также то, что рекомендует Sidekiq в его передовая практика.
В случае работы, которую вы не хотите сокращать, важно знать пределы и способы защитить себя.
Пример работы в опасности
Поскольку пример стоит 1000 объяснений, выполните следующие действия:
-
Скопируйте приведенный ниже код задания в соответствующую папку вашего приложения.
-
Запустите в своем терминале
bundle exec sidekiq -C config/sidekiq.yml -t
-
В консоли рельсов вашего приложения выполните:
LongRunningNotSafeJob.perform_async
-
В окне, где запущен Sidekiq, выполните
Ctrl-c
-
Наблюдайте за результатом
-
Повторите операцию несколько раз и посмотрите, где программа остановится. Обычно это никогда не бывает в одном и том же месте.
# app/jobs/long_running_not_safe_job.rb
class LongRunningNotSafeJob
include Sidekiq::Job
def perform(init_index=1)
puts "I am entering in a long running worker"
(init_index..20).each do |i|
puts "Doing a payment for index #{i}"
sleep(1)
puts "Saving payment for index #{i} in a database record"
end
puts "I am exiting from a long running worker"
end
end
Каждый раз, когда Sidekiq останавливается, он возвращает это задание в очередь, которая возобновляется с позиции 1.
В качестве примера из реальной жизни, который может создать проблему, давайте возьмем случай вызова API на ресурсе. create
. Я спрашиваю свой API foo
создать ресурс для себя bar
. Как только операция завершится успешно, API должен вернуть мне идентификатор foo
которые я сохраняю, чтобы иметь возможность работать с ними позже. Если мое задание Sidekiq останавливается сразу после вызова API, но до того, как я сохранил идентификатор, я получаю foo
призрак, который будет преследовать мое приложение, когда мне придется заниматься отладкой.
Это может быстро оказаться очень чувствительным, когда мы говорим о платежных транзакциях.
-
Уважайте лучшие практики Sidekiq ⬆️
-
Защитите долго выполняющиеся задания, помня, что они могут остановиться в любой момент после 25-секундной задержки. В приведенном ниже примере после каждого цикла задание будет проверять, существует ли процесс Sidekiq, получивший приказ об остановке (
quiet
), и задание выполняется этим процессом. В этом случае задание вернется в очередь (с параметром, позволяющим возобновить его с того места, где оно было остановлено) и выйдет из цикла с помощьюbreak
. Таким образом, когда запускается новый процесс, задание снова начнет свою работу.
# app/jobs/long_running_safe_job.rb
class LongRunningSafeJob
include Sidekiq::Job
def perform(init_index=20)
puts "I am entering in a long running worker"
(init_index..20).each do |i|
puts "Doing a payment for index #{i}"
sleep(1)
puts "Saving payment for index #{i} in a database record"
# Sidekiq let 25 seconds to finish running workers when it receive a signal to stop or restart
# Quitting here when then process is quiet avoids losing important informations during the loop.
if Sidekiq::ProcessSet.new.any? { |p| p["pid"] == Process.pid && p["quiet"] == "true" }
puts "SidekiqProcess is terminating. Gracefully exiting ..."
# Reschedule job so it can be reruned safely later
LongRunningSafeWorker.perform_async(i + 1)
break
end
end
puts "I am exiting from a long running worker"
end
end
Теперь, когда вас предупредили, будьте бдительны к сигналам 😘
Чтобы пойти дальше, вот очень хорошо написанная статья, также опубликованная в Ruby Weekly на этой неделе, в которой подробно объясняется, как работает Sidekiq: https://www.mikeperham.com/how-sidekiq-works/
И спасибо за рыбу
— Квентин
Как вы знаете, за Ruby Biscuit стоит Capsens 👋, мы веб-агентство, которое занимается Ruby on Rails уже 10 лет.
Со временем мы поняли, что многие разработчики выбирают свою компанию случайно, когда они могут процветать и получать больше пользы в структурах, которые им больше подходят. Более того, мы знаем, в какой степени процессы подбора персонала могут быть не адаптированы к нашей профессии и нашему профилю.
Что действительно хорошо, так это то, что мы в Capsens прекрасно знаем экосистему RoR во Франции и имеем обширную сеть компаний. Большинство из них — это хорошо зарекомендовавшие себя компании (более 5 лет), в которых уже присутствуют технические команды и которые в первую очередь ищут руководителей и старших разработчиков.
Вот почему мы решили использовать наши ресурсы, чтобы помочь вам найти работу своей мечты!
Итак, у вас есть несколько лет опыта? Хотите найти следующую должность ведущего разработчика своей мечты?
Конкретно произойдет следующее:
-
Ответьте на этот информационный бюллетень, представившись в двух строках!
-
Я немедленно пришлю вам наш технический тест для оценки вашего стажа
-
Я предлагаю вам время для звонка, чтобы познакомиться с вами, и для того, чтобы вы рассказали мне, чего вы ищете, чтобы преуспевать в компании.
-
Предлагаю вам 3 компании, соответствующие вашему профилю и вашим стремлениям. Для каждой из этих компаний:
-
Я предоставлю вам как можно больше информации и отвечу на все ваши вопросы в сообщении (время работы, атмосфера, размер и старшинство команды, обязанности, пространство для маневра при переговорах о зарплате, расположение офисов, политика удаленной работы и т. д.). Никаких ненужных звонков.
-
Прежде чем встретиться с самим рекрутером, я познакомлю вас с разработчиком из его команды. Тогда вы сможете получить представление о том, как обстоят дела изнутри.
-
Наконец-то рекрутер вас примет! Он уже будет располагать всей информацией, которую я ему дал о вас, что позволит вам перейти к делу!
-
Начинайте, мы ждем вашего письма! И если вам уже нравится ваша работа, не обращайтесь к нам! Или сделайте это, чтобы порекомендовать нам вашу компанию 😉
Мелани
2024-03-06 15:49:20
1709782259
#Sidekiq #сигналы #знай #все #избегай #проблем