Home » 🍪🚦Sidekiq и сигналы, знай все и избегай проблем

🍪🚦Sidekiq и сигналы, знай все и избегай проблем

В предыдущий информационный бюллетеньИсмаэль объяснил вам, что 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 !

Прежде чем оставить вас в руках Квентина для написания статьи в этом месяце, я хотел бы напомнить вам, что вы все можете высказать свое мнение в комментариях и поделиться своим опытом по темам, которые мы рассматриваем. Вы также можете поставить лайк ❤️ и/или поделиться новостной рассылкой с другом! 😉

Read more:  Абель Феррейра признает заслугу «Ботафого» в победе над «Палмейрасом»: «Поздравляю нашего соперника, у которого есть все, чтобы стать чемпионом»

Хорошее чтение.

Здесь я просто беру определения из Интернета, а также ссылки, чтобы идти дальше.

Сигнал: Форма связи между процессами, используемыми 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 призрак, который будет преследовать мое приложение, когда мне придется заниматься отладкой.

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

  1. Уважайте лучшие практики Sidekiq ⬆️

  2. Защитите долго выполняющиеся задания, помня, что они могут остановиться в любой момент после 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 лет), в которых уже присутствуют технические команды и которые в первую очередь ищут руководителей и старших разработчиков.

Вот почему мы решили использовать наши ресурсы, чтобы помочь вам найти работу своей мечты!

Итак, у вас есть несколько лет опыта? Хотите найти следующую должность ведущего разработчика своей мечты?

Конкретно произойдет следующее:

  1. Ответьте на этот информационный бюллетень, представившись в двух строках!

  2. Я немедленно пришлю вам наш технический тест для оценки вашего стажа

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

  4. Предлагаю вам 3 компании, соответствующие вашему профилю и вашим стремлениям. Для каждой из этих компаний:

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

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

    3. Наконец-то рекрутер вас примет! Он уже будет располагать всей информацией, которую я ему дал о вас, что позволит вам перейти к делу!

Начинайте, мы ждем вашего письма! И если вам уже нравится ваша работа, не обращайтесь к нам! Или сделайте это, чтобы порекомендовать нам вашу компанию 😉

Мелани

2024-03-06 15:49:20


1709782259
#Sidekiq #сигналы #знай #все #избегай #проблем

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.