2013-09-28 2 views
4

У меня есть сервер backend Rails с Sidekiq, который служит сервером API. Приложение работает следующим образом:Использование Puma и Sidekiq в приложении backend Rails

  1. Мой сервер Rails получает много запросов от входящих клиентов API одновременно.

  2. Для каждого из этих запросов сервер Rails будет распределять задания на сервер Sidekiq. Сервер Sidekiq предоставляет запросы внешним API (например, Facebook) для получения данных, а также анализирует их и возвращает результат на сервер Rails.

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

Моя задача - заставить мое приложение одновременно отвечать на входящие запросы. То есть для каждого входящего запроса мое приложение должно обрабатываться параллельно: совершать вызовы внешних API-интерфейсов, получать данные и возвращать результат.

Теперь я знаю, что Puma может добавлять параллелизм в приложение Rails, а Sidekiq - многопоточное.

Мой вопрос: действительно ли мне нужен Sidekiq, если у меня уже есть Puma? Какая польза от использования Puma и Sidekiq?

В частности, с помощью Puma я просто вызываю внешние вызовы API, обработку данных и т. Д. Из моего приложения Rails, и они будут автоматически совпадать.

ответ

6

Да, вы, вероятно, хотите использовать Puma и Sidekiq. Здесь есть две проблемы.

Параллелизм (как вам кажется, вы уже знаете) - это количество веб-запросов, которые могут обрабатываться одновременно. Использование сервера приложений, такого как Puma или Unicorn, безусловно, поможет вам улучшить параллелизм, чем сервер веб-кирпича по умолчанию.

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

Причина, по которой эти две вещи связаны, состоит в том, что количество или запросы в секунду, которые может обрабатывать ваше приложение, является функцией как среднего времени обработки для каждого запроса, так и количества рабочих процессов, принимающих запросы. Скажем, среднее время отклика составляет 100 мс. Затем один веб-рабочий может обрабатывать 10 запросов в секунду. Если у вас 5 работников, вы можете обрабатывать 50 запросов в секунду. Если ваше среднее время отклика составляет 500 мс, тогда вы можете обрабатывать 2 reqs/sec с одним рабочим и 10 reqs/sec с 5 рабочими.

Взаимодействие с внешними API-интерфейсами может быть медленным время от времени, и в худшем случае это может быть очень ненадежным с серверами, не реагирующими на удаленный сервер, или сбоями в сети или замедлением. Sidekiq - отличный способ изолировать ваше приложение (и ваших конечных пользователей) от возможности медленного ответа удаленного API. Представьте, что удаленный API работает по какой-то причине медленно и что среднее время отклика от него замедлилось до 2 секунд на запрос. В этом случае вы сможете обрабатывать только 2,5 рек/сек с 5 рабочими. Если больше трафика, чем у ваших конечных пользователей, может возникнуть долгое время ожидания до того, как любая страница вашего приложения сможет ответить, даже те, которые не делают удаленные вызовы API, потому что все ваши веб-сотрудники могут ожидать медленного удаленного API ответить. По мере увеличения трафика ваши пользователи начнут получать таймауты подключения.

Идея использования Sidekiq заключается в том, что вы отделяете время, потраченное на внешний API от ваших веб-работников. Вы в основном принимаете запрос данных от своего пользователя, передаете его в Sidekiq и сразу же возвращаете ответ пользователю, который в основном говорит «мы обрабатываем ваш запрос». Sidekiq может затем забрать работу и сделать внешний запрос. После того, как у него есть данные, он может сохранить эти данные обратно в ваше приложение. Затем вы можете использовать веб-сокеты, чтобы направить уведомление пользователю, что данные готовы. Или даже подталкивайте данные непосредственно к ним и соответствующим образом обновляйте страницу. (Вы также можете использовать опрос, чтобы страница постоянно запрашивала «еще готова?», Но это очень неэффективно очень быстро.)

Надеюсь, это имеет смысл. Дайте знать, если у вас появятся вопросы.

+1

Большое спасибо, Джереми. Это имеет большой смысл. Мой процесс занимает от одного до двух монет, чтобы извлекать данные из внешних API. Меня беспокоит, что ресурсы моих работников заперты, ожидая данных от API. Помогает ли Sidekiq решить эту проблему? – AdamNYC

+1

Да, Sidekiq поможет с этим. Последний длинный абзац моего ответа - это описание того, как это будет работать. –

+0

Спасибо Джереми. Я получил эту часть. Мой вопрос: даже если мой Sidekiq создает несколько потоков и ждет ответов от внешних API, будут ли эти потоки хранить ресурсы (ЦП, ОЗУ) в течение нескольких минут в ожидании? Я предполагаю, что если мое приложение может работать асинхронно, то, ожидая ответа, мои ресурсы сервера могут использоваться для выполнения других запросов или для обработки данных, возвращаемых из более ранних запросов. – AdamNYC

4

Sidekiq, как Resque и Delayed Job, предназначен для обеспечения асинхронной обработки заданий из очереди.

Если вам не нужны задания, которые нужно ставить в очередь и запускать асинхронно, нет никакой существенной выгоды (или вреда) для использования Sidekiq.

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

+0

Спасибо @colinm. Мои клиенты ждут данных. Как правило, для моих работников требуется куча минут, чтобы вернуть результат клиентам. Однако клиенты могут отправлять сразу несколько запросов. Я хотел бы начать обработку данных для каждого из запросов параллельно и возвращать клиентам все, что возвращалось с моего сервера Sidekiq. Что было бы хорошим решением для моей ситуации? Спасибо вам за понимание. – AdamNYC

+0

Более 750 мс? Асинхронный. – Barry