как такое делать? best practice

89 views
Skip to first unread message

Igor Kasyanchuk

unread,
Aug 25, 2011, 10:05:49 AM8/25/11
to RubyOnRails to russian
Привет

Есть задача сделать один функционал на сайте, скажем очень крутая
Contact форма, с всякими там другими штуками и связывающими моделями.
Эта форма будет работать в 2х приложениях, база будет у них одна и та
же.
Там будет надо будет добавить UI, контролеры, модели. Вобщем будет
свое мини приложение.

Потом через месяц надо будет добавить в 2е приложение туже функцию, но
даные будут общие, тоесть из приложения А будут видны в В.

Как такие штуки делаются? Может есть пример? (думал взять на пример
newrelic и там смотреть, но там нету базы и может есть что-то попроще)

Спасибо

Alexander Simonov

unread,
Aug 25, 2011, 11:28:06 AM8/25/11
to ror...@googlegroups.com
сделать модуль или gem? или юзать рельсы 3.1 где есть mountable apps

2011/8/25 Igor Kasyanchuk <igorkas...@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

--
WBR, Alexander Simonov

Igor Kasyanchuk

unread,
Aug 25, 2011, 11:32:49 AM8/25/11
to RubyOnRails to russian
да, про модуль и думаю,

надеюсь кто-то подскажет где можно посмотреть пример, а то в гугле
разве что hello world примеры нахожу

On 25 Сер, 18:28, Alexander Simonov <asimo...@gmail.com> wrote:
> сделать модуль или gem? или юзать рельсы 3.1 где есть mountable apps
>

> 2011/8/25 Igor Kasyanchuk <igorkasyanc...@gmail.com>:


>
>
>
>
>
>
>
>
>
> > Привет
>
> > Есть задача сделать один функционал на сайте, скажем очень крутая
> > Contact форма, с всякими там другими штуками и связывающими моделями.
> > Эта форма будет работать в 2х приложениях, база будет у них одна и та
> > же.
> > Там будет надо будет добавить UI, контролеры, модели. Вобщем будет
> > свое мини приложение.
>
> > Потом через месяц надо будет добавить в 2е приложение туже функцию, но
> > даные будут общие, тоесть из приложения А будут видны в В.
>
> > Как такие штуки делаются? Может есть пример? (думал взять на пример
> > newrelic и там смотреть, но там нету базы и может есть что-то попроще)
>
> > Спасибо
>
> > --
> > --
> > Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "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
>
> --
> WBR, Alexander Simonov

alexey.petrushin

unread,
Aug 25, 2011, 7:24:34 PM8/25/11
to RubyOnRails to russian
гем/модуль с общими куками проще всего, можно еще как виждет сделать
так вроде правильней но сложней

Дмитрий Лихачёв

unread,
Aug 26, 2011, 12:02:03 AM8/26/11
to ror...@googlegroups.com
Если данные общие то лучше всего делать микросервис - отдельное приложение, развёртывающееся на отдельном доменном имени и имеющее свой API (REST).  Для облегчения делаете клиентский API и завертываете его в gem. Ну и вообще, гуглите Service Oriented Design + есть книжка "Service Oriented Design With Rails"..

В качестве примера можете посмотреть на то как работает http://github.com/errbit/errbit (сборщик ошибок в приложений) и клиентский gem hoptoad_notifier

alexey.petrushin

unread,
Aug 27, 2011, 11:08:26 AM8/27/11
to RubyOnRails to russian
по моему с сервис ориентированным дизайном в руби проблема. чтобы его
использовать нужно иметь возможность просто делать вызовы других
сервисов, а в руби, учитывая его однопоточность это совсем не легко и
не просто.

Дмитрий Лихачёв

unread,
Aug 28, 2011, 10:07:09 PM8/28/11
to ror...@googlegroups.com
Как раз с сервис ориентированным дизайном в RoR всё отлично

27 августа 2011 г. 22:08 пользователь alexey.petrushin <alexey.p...@gmail.com> написал:
Message has been deleted

Alexander Simonov

unread,
Aug 29, 2011, 12:02:31 PM8/29/11
to ror...@googlegroups.com
AJAX?
Делаете запросы к своему хендлеру, он связывается со сторонним сервисом и потом выплевываете результат.
или связка AJAX + PUSH.

On Aug 29, 2011, at 4:01 PM, alexey.petrushin wrote:

> и как в нем без ивентедмашин сделать несколько параллельных запросов к
> другому сервису не заблокировав при этом текущий процесс?
>
> On 29 авг, 06:07, Дмитрий Лихачёв <l...@openteam.ru> wrote:
>> Как раз с сервис ориентированным дизайном в RoR всё отлично
>>
>> 27 августа 2011 г. 22:08 пользователь alexey.petrushin <
>> alexey.petrus...@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
>
> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "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

Alexander Simonov
asim...@gmail.com



Max Lapshin

unread,
Aug 29, 2011, 12:25:07 PM8/29/11
to ror...@googlegroups.com
2011/8/29 Alexander Simonov <asim...@gmail.com>:

> AJAX?
> Делаете запросы к своему хендлеру, он связывается со сторонним сервисом и потом выплевываете результат.
> или связка AJAX + PUSH.
>

Речь идет о том, что связка со сторонним сервисом занимает до 5 секунд.
Если на один ответ надо запросить 2-3 сервиса, то время складывается,
а это означает, что больно дорогой получается прокси сервер:
по 80-200 мегабайт на одного клиента и обрабатывать его по 5-20 секунд…

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

Дмитрий Лихачёв

unread,
Aug 31, 2011, 10:05:02 PM8/31/11
to ror...@googlegroups.com
queue ?

29 августа 2011 г. 23:25 пользователь Max Lapshin <max.l...@gmail.com> написал:
2011/8/29 Alexander Simonov <asim...@gmail.com>:
> AJAX?
> Делаете запросы к своему хендлеру, он связывается со сторонним сервисом и потом выплевываете результат.
> или связка AJAX + PUSH.
>

Речь идет о том, что связка со сторонним сервисом занимает до 5 секунд.
Если на один ответ надо запросить 2-3 сервиса, то время складывается,
а это означает, что больно дорогой получается прокси сервер:
по 80-200 мегабайт на одного клиента и обрабатывать его по 5-20 секунд...


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

--

Alexander Simonov

unread,
Sep 1, 2011, 2:30:47 AM9/1/11
to ror...@googlegroups.com
Макс откуда ты взял такие цифры?
Смысл в том что бы запросы к внешним системам обрабатывать в фоне, а не делать это сразу.
Достучались до сервиса, забрали результат, обработали как нам надо, отдали нужный JSON клиенту.
И где тут 80-200 метров на одного клиента?

On Aug 29, 2011, at 7:25 PM, Max Lapshin wrote:

> 2011/8/29 Alexander Simonov <asim...@gmail.com>:
>> AJAX?
>> Делаете запросы к своему хендлеру, он связывается со сторонним сервисом и потом выплевываете результат.
>> или связка AJAX + PUSH.
>>
>
> Речь идет о том, что связка со сторонним сервисом занимает до 5 секунд.
> Если на один ответ надо запросить 2-3 сервиса, то время складывается,
> а это означает, что больно дорогой получается прокси сервер:
> по 80-200 мегабайт на одного клиента и обрабатывать его по 5-20 секунд...
>
> И всё это ради пары запросов, в которых надо числа сложить. Нет,
> рельсы чудесный продукт, но некоторые вещи ими делаются плохо.
>

Max Lapshin

unread,
Sep 1, 2011, 2:48:36 AM9/1/11
to ror...@googlegroups.com
2011/9/1 Alexander Simonov <asim...@gmail.com>:

> Макс откуда ты взял такие цифры?
> Смысл в том что бы запросы к внешним системам обрабатывать в фоне, а не делать это сразу.
> Достучались до сервиса, забрали результат, обработали как нам надо, отдали нужный JSON клиенту.
> И где тут 80-200 метров на одного клиента?
>


Один инстанс рельс весит 80-200 мегабайт, а то и больше, до
полугигабайта в зависимости от ситуации.

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

Об этом и шла речь, говоря что рельсы как платформа для API, тем более
распределенного не самый идеальный вариант.

Sergey Petrov

unread,
Sep 1, 2011, 3:41:58 AM9/1/11
to RubyOnRails to russian
Почему нельзя просто подключиться к этой общей базе из двух
приложений? Причем тут AJAX, PUSH, какие-то прокси? Судя по описанию
нужно всего лишь сделать два приложения разного вида но с общими
данными, т.е. "модуль-джем" как писали выше.

Igor Kasyanchuk

unread,
Sep 1, 2011, 4:07:35 AM9/1/11
to RubyOnRails to russian
2 приложения, с общими даными и функционалом, несколько контролеров и
вьюх :) уже начали делать как engine

alexey.petrushin

unread,
Sep 1, 2011, 12:16:41 PM9/1/11
to RubyOnRails to russian
> Почему нельзя просто подключиться к этой общей базе из двух приложений?
так и делают, но это совсем не сервис-ориентированная архитектура :)

Alexander Simonov

unread,
Sep 1, 2011, 3:43:12 PM9/1/11
to ror...@googlegroups.com
Эм.... Так по-моему это не проблема рельс.
Рельсы ведь не делают запрос.
Тут больше проблема руби и тредов в руби.
В принципе можно включить тредсейв режим в рельсах, но проблема в том
что ооочень мало(практически парочку) джемом на руби нормально
работают с тредами.
Но опять же это ничего не решит. Надо писать на языке, который
нормально поддерживает многопоточность.

2011/9/1 Max Lapshin <max.l...@gmail.com>:


> 2011/9/1 Alexander Simonov <asim...@gmail.com>:
>> Макс откуда ты взял такие цифры?
>> Смысл в том что бы запросы к внешним системам обрабатывать в фоне, а не делать это сразу.
>> Достучались до сервиса, забрали результат, обработали как нам надо, отдали нужный JSON клиенту.
>> И где тут 80-200 метров на одного клиента?
>>

--
WBR, Alexander Simonov

Max Lapshin

unread,
Sep 1, 2011, 3:48:38 PM9/1/11
to ror...@googlegroups.com
2011/9/1 Alexander Simonov <asim...@gmail.com>:

> Эм.... Так по-моему это не проблема рельс.
> Рельсы ведь не делают запрос.
> Тут больше проблема руби и тредов в руби.
> В принципе можно включить тредсейв режим в рельсах, но проблема в том
> что ооочень мало(практически парочку) джемом на руби нормально
> работают с тредами.

> Но опять же это ничего не решит. Надо писать на языке, который
> нормально поддерживает многопоточность.
>

Какие ещё треды? evented — вот решение.

Alexander Simonov

unread,
Sep 1, 2011, 3:57:12 PM9/1/11
to ror...@googlegroups.com
а как ты собираешься делать несколько запросов к разным сервисам одновременно?

2011/9/1 Max Lapshin <max.l...@gmail.com>:
> Какие ещё треды? evented -- вот решение.
--
WBR, Alexander Simonov

Дмитрий Лихачёв

unread,
Sep 2, 2011, 12:06:50 AM9/2/11
to ror...@googlegroups.com
Зачем заведомо усложнять задачу? В данном случае сервис _один_. 

И вообще, как-то люди делают gem'ы для работы с API социальных сетей, с амазоном, и ещё много с чем и особо не заморачиваются по поводу тредов. И что самое удивительное  - они почти всегда правы. 

2 сентября 2011 г. 2:57 пользователь Alexander Simonov <asim...@gmail.com> написал:

Max Lapshin

unread,
Sep 2, 2011, 1:39:17 AM9/2/11
to ror...@googlegroups.com
2011/9/1 Alexander Simonov <asim...@gmail.com>:

> а как ты собираешься делать несколько запросов к разным сервисам одновременно?
>

Ты меня просто убиваешь такими вопросами.

Отправляешь пачку запросов и ждешь ответа с них со всех в течении
какого-то таймаута.

Alexander Simonov

unread,
Sep 2, 2011, 2:22:35 AM9/2/11
to ror...@googlegroups.com

On Sep 2, 2011, at 8:39 AM, Max Lapshin wrote:

> 2011/9/1 Alexander Simonov <asim...@gmail.com>:
>> а как ты собираешься делать несколько запросов к разным сервисам одновременно?
>>
>
> Ты меня просто убиваешь такими вопросами.

помоему нормальный вопрос.

>
> Отправляешь пачку запросов и ждешь ответа с них со всех в течении
> какого-то таймаута.

Отправляешь и ждешь. Это как-то не прикольно вообще ждать ответа со стороннего сервиса.
Пока идет запрос, можно не просто ждать, а что-то делать. Потому я и говорю что запрос к внешнему сервису делать лучше в отдельном треде, который пусть ждет,
а основной процесс пусть работает, когда прийдет ответ от внешнего сервиса - мы его сразу обработаем.
Message has been deleted

Max Lapshin

unread,
Sep 2, 2011, 6:53:43 AM9/2/11
to ror...@googlegroups.com
> evented это и есть "треды", только наоборот.
>

evented — это ровно те же треды, только с userland шедулером и
фиксацией на одно ядро.

Reply all
Reply to author
Forward
0 new messages