Когда передавать работу с веб-сервера работнику

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

Рассмотрим следующие примеры:

  1. Войти с Facebook

    def sign_in
        response = Faraday.get("https://graph.facebook.com/me?fields=id,email&access_token=#{some_token}")
        user_info = JSON.parse(response.body)
        @user = User.find_by(uid: user_info["id"])
        ...
    end
    
  2. Отправить push-уведомление через Google Firebase

    def send_push_notification
      ...
      fcm = FCM.new(FCM_KEY)
      registration_ids = [recipient_token]
      resp = fcm.send(registration_ids, data: {body: notification_params[:body]})
      ...
    end
    

В обоих примерах веб-запросы к сторонней службе являются синхронными и, возможно, дорогостоящими. Интуитивно я бы попытался обработать эти случаи с помощью отдельного работника, потому что они блокируют основное приложение. Но я не уверен на 100 %, что означает блокировка. Означает ли это, что когда 100 пользователей пытаются sign_in и каждый вызов Faraday.get занимает 1 секунду, всем пользователям потребуется 100 секунд для входа в систему?


person Maximus S    schedule 02.11.2016    source источник
comment
Для отправки уведомления через FCM вы можете использовать фоновый процесс. например, sidekiq, delayed_job и т. д. и это правильный путь к интегрированному модулю уведомлений внутри приложения.   -  person Darpan Chhatravala    schedule 08.11.2016
comment
@DarpanChhatravala Да! Я хотел бы услышать о последней части вопроса, которая спрашивает ... Я не уверен на 100%, что означает блокировка. Означает ли это, что когда 100 пользователей пытаются войти в систему и каждый вызов Faraday.get занимает 1 секунду, всем пользователям потребуется 100 секунд для входа в систему?   -  person Maximus S    schedule 08.11.2016
comment
у меня нет опыта реализации со мной, я однажды читал блог, вы можете попробовать реализовать драгоценный камень 'faraday-request-timer'. отсюда вы получите общее запрошенное время. надеюсь, это поможет полностью :)   -  person Darpan Chhatravala    schedule 08.11.2016


Ответы (1)


Означает ли это, что когда 100 пользователей пытаются войти в систему и каждый вызов Faraday.get занимает 1 секунду, всем пользователям потребуется 100 секунд для входа в систему?

Упрощенный ответ: да.

В очень простом сценарии 1-й пользователь будет ждать 1 секунду, 2-й пользователь будет ждать 2 секунды и так далее.

Если ваше приложение/веб-сервер не прерывает запрос пользователя, 100-й пользователь будет ждать 100 секунд.

Подробнее: зависит.

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

Например: если вы настроили Puma на использование 2 воркеров, ваше приложение будет обрабатывать запросы 2 пользователей одновременно.

Таким образом, 1-й и 2-й пользователи будут ждать 1 секунду, 3-й и 4-й пользователи будут ждать 2 секунды, а 99-й и 100-й пользователи будут ждать 50 секунд.

Поскольку каждый процесс Puma потребляет значительный объем ЦП и памяти, у вас не может быть бесконечного количества рабочих процессов. Вот почему очень интересно иметь фоновый процесс для отправки этих push-уведомлений.

В Sidekiq (например) стоимость делегирования работы работнику чрезвычайно низкая, и поэтому пользователи вашего веб-сайта не будут оштрафованы.

person Lucas Costa    schedule 08.11.2016