sidekiq возврат значения

202 views
Skip to first unread message

Rudenkov Konstantin

unread,
Dec 24, 2012, 10:49:42 PM12/24/12
to ror...@googlegroups.com
Всем привет. Извиняюсь за нубовский вопрос. 
[преамбула] Своими админскими мозгами полез разбираться с sidekiq
[проблема] есть метод perform, который грубо ховоря делает a+b. Делаю вызов Worker.perform_async(a,b) - как получить результат? 

ZaK

unread,
Dec 25, 2012, 12:15:46 AM12/25/12
to ror...@googlegroups.com
записать в бд либо тот же редис

вторник, 25 декабря 2012 г., 7:49:42 UTC+4 пользователь Rudenkov Konstantin написал:

Руденков Константин

unread,
Dec 25, 2012, 12:16:44 AM12/25/12
to RubyOnRails to russian
Блин, этот костыль понятен :)

________________________________________
best regards
Konstantin Rudenkov


25 декабря 2012 г., 9:15 пользователь ZaK <zak....@gmail.com> написал:
--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
 
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

Phil Pirozhkov (pirj)

unread,
Dec 25, 2012, 4:03:29 AM12/25/12
to ror...@googlegroups.com
Встречный вопрос - а где вы его хотите получить? В том же контроллере, из которого вызываете sidekiq? В чём сакральный смысл тогда, разгрузить единственный веб-сервер, откладывая http responce на совершенно неопределённый срок?

Было бы понятнее, если бы вы сообщили, откуда вы вызываете perform, что именно у вас делает этот воркер, и какова ваша конфигурация, где крутятся воркеры, и где веб-сервер. А то пока создаётся впечатление, что раз вам результат нужен в том же месте, где вы воркер вызываете, это уже не sidechain, а просто вы хотите нагрузку снизить на сервер.

Руденков Константин

unread,
Dec 25, 2012, 4:10:29 AM12/25/12
to RubyOnRails to russian
Я раньше делал подобные вещи на питоновском Celery, там этот функционал есть и явно понятен. Сейчас я пытаюсь разобраться с sidekiq, потому пока не принципиально где воркеры и где остальное, все на локальной машине. 
Я вызываю perform из контроллера, и тут собстаенно ничего не мешает проверить его present?  и отдать потом результат по ajax (это как вариант). Ну или же я может быть :) я хчоу в консольном приложении использовать подобный функционал, тут мне не обязательно вообще задумываться о том, когда ответ будет получен, мне нужно выдать только результат. Соотвественно возвращаюсь к своему изначальному вопросу.

________________________________________
best regards
Konstantin Rudenkov


25 декабря 2012 г., 13:03 пользователь Phil Pirozhkov (pirj) <pirj...@gmail.com> написал:
Встречный вопрос - а где вы его хотите получить? В том же контроллере, из которого вызываете sidekiq? В чём сакральный смысл тогда, разгрузить единственный веб-сервер, откладывая http responce на совершенно неопределённый срок?

Было бы понятнее, если бы вы сообщили, откуда вы вызываете perform, что именно у вас делает этот воркер, и какова ваша конфигурация, где крутятся воркеры, и где веб-сервер. А то пока создаётся впечатление, что раз вам результат нужен в том же месте, где вы воркер вызываете, это уже не sidechain, а просто вы хотите нагрузку снизить на сервер.

--

MitEvo

unread,
Dec 25, 2012, 4:36:01 AM12/25/12
to ror...@googlegroups.com
А как узнать, что обработка закончилась и можно из базы прочитать этот результат?

вторник, 25 декабря 2012 г., 8:15:46 UTC+3 пользователь ZaK написал:

Руденков Константин

unread,
Dec 25, 2012, 4:36:32 AM12/25/12
to RubyOnRails to russian
как я понимаю, это вызов worker.present?

________________________________________
best regards
Konstantin Rudenkov


25 декабря 2012 г., 13:36 пользователь MitEvo <admi...@gmail.com> написал:
--

Konstantin Shabanov

unread,
Dec 25, 2012, 4:39:14 AM12/25/12
to ror...@googlegroups.com
Точно нужен sidekiq, а не сам celluloid (http://celluloid.io/ http://railscasts.com/episodes/367-celluloid)?

Руденков Константин

unread,
Dec 25, 2012, 4:42:04 AM12/25/12
to RubyOnRails to russian
вообще, в иделе, нужна достаточно проработанная замена Celery на руби (ну и соответсвенно и рельсы), и что бы можно досточно легко систему распределенных воркеров построить (на N-серверов). Про celluloid сейчас почитаю. Спасибо. 

________________________________________
best regards
Konstantin Rudenkov


25 декабря 2012 г., 13:39 пользователь Konstantin Shabanov <ma...@etehtsea.me> написал:

Руденков Константин

unread,
Dec 28, 2012, 9:47:32 AM12/28/12
to RubyOnRails to russian
Жаль, ответа я так и не нашел нигде. Ни касательно resque, ни касательно sudekiq. А использовать rcelery очень не хочется, так как он, похоже, не развивается. 

________________________________________
best regards
Konstantin Rudenkov


25 декабря 2012 г., 13:42 пользователь Руденков Константин <rude...@gmail.com> написал:

Max Lapshin

unread,
Dec 28, 2012, 10:09:41 AM12/28/12
to RubyOnRails to russian
Да потому что системы отложенных задач не подразумевают возврата ответа в тот контекст, где задача поднималась.

Вы уперлись в неверное решение неправильно поставленной задачи.

Если хочется аяксом показать результат фоновой задачи, то так и делайте: аяксом отправляйте результат фоновой задачи.

А возврат долгого вычисления в вызывающий контекст — это не про рельсы.


2012/12/28 Руденков Константин <rude...@gmail.com>

Руденков Константин

unread,
Dec 28, 2012, 10:24:15 AM12/28/12
to RubyOnRails to russian
почему не вписывается в контекст, когда я могу вполне делать запрос на состояние воркера, и если воркер выполнился, то запросить результат?

________________________________________
best regards
Konstantin Rudenkov


28 декабря 2012 г., 19:09 пользователь Max Lapshin <max.l...@gmail.com> написал:

Руденков Константин

unread,
Dec 28, 2012, 10:46:30 AM12/28/12
to RubyOnRails to russian
И в довесок, и то и другое может использоваться вне рельс, как я понимаю. 

________________________________________
best regards
Konstantin Rudenkov


28 декабря 2012 г., 19:24 пользователь Руденков Константин <rude...@gmail.com> написал:

Руденков Константин

unread,
Dec 28, 2012, 11:04:59 AM12/28/12
to RubyOnRails to russian
И...зайду с другой стороны. 
У меня есть массив данных, большой, есть алгоритм обработки этих данных, который занимет приличное время, есть морда на рельсах. 
Юзер вводит свои параметры выборки и обработки, далее я ему показываю - ожидай, а сам запускаю ворке, скажем на skiruby, как обсчет выполняется, я выдаю результат юзеру. Где тут ошибка контекста и не правильное понимание задачи? 
Python+celery+django+numpy решают этот вопрос на ура, хоть 10 воркеров у меня, хоть 1000, хоть на одной машине, хоть на 1000. Но, к сожалению, у меня достаточно узкие рамки и я вынужден использовать ruby+rails. И разве еще не возникало подобной задачи ни у кого? 

Или в мире руби и рельс, отдача результата отдается на откуп программисту? То есть, я запускаю воркер, он считает, а одновременно с этим я пишу 
а) проверку на выполнение воркера
б) код в воркере, котрый результат куда-то пишет
в) на клиенте загрузка результата из некой шины

Что-то сие как-то не вязется с DRY, магией рельс и простотой разработки. 

________________________________________
best regards
Konstantin Rudenkov


28 декабря 2012 г., 19:46 пользователь Руденков Константин <rude...@gmail.com> написал:

afa alone

unread,
Dec 28, 2012, 3:50:26 PM12/28/12
to ror...@googlegroups.com
введи признак завершения обработки и мониторь аяксом. таймер поставить несложно ведь, правда?
а скрещивать ежа с ужом потому что понадобилась колючая проволока... гм.

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

28 декабря 2012 г., 20:04 пользователь Руденков Константин <rude...@gmail.com> написал:

Руденков Константин

unread,
Dec 28, 2012, 9:51:57 PM12/28/12
to RubyOnRails to russian
Суть вопроса: я могу нативно получить методом объекта занчение вычисления a+b из perform_asyn, или мне писать костыль, который будет класть результат в тот же редис, и потом костыль его получения от туда?

Это все, что мне интересно. А то как реализовать, ели это не возможно, я буду думать, если это не возможно.

________________________________________
best regards
Konstantin Rudenkov


29 декабря 2012 г., 0:50 пользователь afa alone <afa....@gmail.com> написал:

afa alone

unread,
Dec 29, 2012, 1:27:12 AM12/29/12
to ror...@googlegroups.com
не можешь. получить синхронно результат вычисления асинхронного метода нельзя. бай дизайн.


29 декабря 2012 г., 6:51 пользователь Руденков Константин <rude...@gmail.com> написал:

Руденков Константин

unread,
Dec 29, 2012, 1:30:05 AM12/29/12
to RubyOnRails to russian
Итить! :)
я это понимаю. Воркер когда-нибудь отработает же. Соответсвенно, когда-нибудь у него будет результат выполнения функции. И далее, когда-нибудь я его получу. 
Каким методом мне его получить? 

Вот как делается на python+celery. Что я не правильно понимаю?!

________________________________________
best regards
Konstantin Rudenkov


29 декабря 2012 г., 10:27 пользователь afa alone <afa....@gmail.com> написал:

Max Lapshin

unread,
Dec 29, 2012, 1:35:33 AM12/29/12
to RubyOnRails to russian
Потому что задрачивать всю систему регулярным опросом состояния тасков — плохая идея.

Надо — поднимашь пуш-канал на браузер и публикуй по нему изменения статуса.

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


2012/12/29 Руденков Константин <rude...@gmail.com>

Руденков Константин

unread,
Dec 29, 2012, 1:45:22 AM12/29/12
to RubyOnRails to russian
Максим, рельсы понятно: это интерфейс. Канал на отдачу задания и получения результата это то же понятно. 
Вот реализация на python+celery. Я хочу подобное на руби, желательно иметь возможность заженить с рельсами, или работать рядом с ними без проблем. Есть проект rcelery, который мне подходит, только меня не устраивает, то, что по ходу он не развивается. 
Подобная связка python+celery у меня прекрасно работает на проекте с геоданными, и все отлично считается, отдается, получается и так далее. 

Я для себя могу писать и на питоне, мне нет проблемы. В данном случае есть жесткое требование использовать ruby и ror. 


________________________________________
best regards
Konstantin Rudenkov


29 декабря 2012 г., 10:35 пользователь Max Lapshin <max.l...@gmail.com> написал:

Alexander Simonov

unread,
Dec 29, 2012, 2:35:35 AM12/29/12
to ror...@googlegroups.com
rcelery не так уж и древен - https://github.com/leapfrogdevelopment/rcelery - всего месяц.

Только вот мне не понятно а накуя?

У меня возник вопрос:
  Вы отправляете данные рассчитать демону rcelery, он там что-то считает… долго считает….
  Больше 60 секунд и у клиента(юзера, пользователя) просто отваливается UI(браузер показал сообщение "падажжи", после этого сделал AJAX запрос и по таймауту от nginx/apache сдох).
  Результаты прийдут в никуда, а инстанс/тред unicorn/passenger/puma будет занят непонятной херней…

Я понимаю что в питоне это так тепло и лампово, но в руби и реилс коммунити такую херню не делают. Руби медленнее чем Питон(Да это так, но мне похер. Мне нравится сам "сахар" руби),
потому и делают бекграунд таски в отдельном процессе/треде и сохраняют куда-то результат.
А уже как он будет доставлен разработчик выбирает сам, благо инструментов хватает - база, редис. мемкеш, faye, sicket.io и тд. и тп.

Кстати rcelery/celery просто у себя в бекграунде я так понимаю ждут ответа от amq с результатом выполнения. 

Руденков Константин

unread,
Dec 29, 2012, 2:47:29 AM12/29/12
to RubyOnRails to russian
Урра, первый вразумительный мне ответ. Александр, спасибо. 
Суть я понял, окей. Собсвенно мне это и нужно было услышать. 



________________________________________
best regards
Konstantin Rudenkov


29 декабря 2012 г., 11:35 пользователь Alexander Simonov <asim...@gmail.com> написал:

Max Lapshin

unread,
Dec 29, 2012, 4:07:57 AM12/29/12
to RubyOnRails to russian
А, ты слово «контекст» не понял. Ясно всё.

Phil Pirozhkov (pirj)

unread,
Dec 29, 2012, 11:11:56 AM12/29/12
to ror...@googlegroups.com
С этой стороны надо было заходить изначально. Я же просил описать задачу  подробно.
Тогда получается, что можно отдать задачу Sidekiq'у, срендерить response, из него сделать ajax запрос, который при получении ответа от сервера покажет результат. В рельсах streaming появится только в 4.0, а сейчас для этого можно примонтировать Sinatra'вское приложение, примерно вот такое https://gist.github.com/3377714 которое будет слушать через PubSub Redis'а сигнал о завершении обработки, принимать его результат и выдавать на клиента. Естественно, воркер должен такой сигнал посылать.

@Max: В этом случае по таймауту не отвалится, потому что Sinatra выставляет HTTP keep-alive.
Если по какой-то причине клиент отвалится, можно ещё и удалить его задание из очереди.

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

Руденков Константин

unread,
Dec 29, 2012, 11:57:01 AM12/29/12
to RubyOnRails to russian
Ну я выше писал, что мне достаточно будет понять, как это делать в отрыве от рельс, чистые консольные скрипты. И как я изначально понимал, что нужно самому будет обрабатывать контроль завершения и передачу результата. Спасибо за ответ и просветление мозгов :). Иногда тяжело переключатся между разными экосистемами. 

________________________________________
best regards
Konstantin Rudenkov


29 декабря 2012 г., 20:11 пользователь Phil Pirozhkov (pirj) <pirj...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages