PDA

Просмотр полной версии : Выбор языка


Kribrum
18.03.2014, 08:52
Добрый день уважаемые.
Никогда не думал, что буду задавать этот вопрос, однако понимание что называется, приходит с опытом:) Опыт уже имеется, а вот в понимании рассчитываю на Вас.
Суть проблемы:
- Есть бот, написанный на JS (на движках WebKit и Gekko, соответственно CasperJS и SlimerJS) в задачу которого входят краулинг страничек, маленькая эвристика, умение авторизоваться, автосабмит форм по установленным правилам, ну и ещё немного по мелочи.
- Есть фронтэнд на ExtJS - с кучей всяких Ajax'ов.
- Есть БД, которая хранит списки сайтов плюс доп. инфу, типа логин/пароль, селекторы и всякую прочую фигню. Пока что - Postgres.
- Есть хелперы, которые раз в некоторое время (час/сутки/5 минут/1 минуту/1 месяц) - запускают ботов на сайты.

Ну и конечно же, есть проблема - что поставить на BackEnd? Первая версия была написана просто на PHP (Symfony 1.4x) и в общем-то нормально работала, пока количество одновременно запускаемых процессов Casper/Slimer не начало переваливать за число "X", когда сервер перестал справляться. Добавление просто пула и задержки выполнения - дало банальный "race condition" при ряде условий. Так как каждый процесс запускается как отдельный exec:

...
$this->casperjs_result = `/path/to/casperjs csp_min.js --url={$this->url} --login={$this->login} --password={$this->password} --action={$this->action}`;
...

---
Если всё это работает синхронно - вопросов нет, просто медленно, что не подходит. Если всё работает ассинхронно - собирать ответы становится проблемно.
Было принято решение - попробовать переписать это на серверный JS, в котором вроде как сильны, ну и соответственно выбрали NodeJs, врубив конечно же Express. Однако, зная что Casper/Slimer - не являются модулями node, сначала получили такую же проблему, запуская через exec(), а потом поставили Spooky, который успешно интегрировался и вообщем-то даже заработал, решив проблему, но прибавил новую:)

Текущая структура начала выглядеть так (итерации):
Запрос:
ExtJs -> NodeJS -> ExpressJS -> SpookyJS -> CasperJS -> PhantomJS -> Webkit
Ответ:
Webkit -> PhantomJS -> CasperJS -> SpookyJS -> ExpressJS -> NodeJS

И заметьте это без БД! У меня нет и не было опыта ведения продакшн проектов такого уровня, сейчас в dev-режиме - открыты 5 консолей и ошибки ловятся на самых разных уровнях, из разряда - (тааааак, упал сервер ноды, потому что в экспресс пришли какие-то странные данные.... Аааааа, это потому что spookyJS не обработал исключение. Хмммм.... А он и не должен судя по документации, ведь исключений здесь быть не может... разве что FillSelectors() в каспере вернул что-то не то... Таааак, похоже на баг CasperJS.... Или PhantomJS? Кстати, а что у нас собственно говоря на странице происходит? Давайте в браузере посмотрим.... БЛДЖАД! Структуру сайта полностью поменяли, новые формы, новые селекторы, новый дизайн и верстка).
То есть несмотря на то, что задача выполняется - скорость разработки апдейтов упала раз в 5-7 судя по трекеру. Что делать господа?
P.S. Очевидный вариант - обновить машину до более мощной - пожалуйста не предлагайте. Ибо мощности - тоже предельны как оказалось=\

machduck
18.03.2014, 23:29
Гляньте на celery. Фреймворк для горизонтальной маштабируемости через rpc. Стандартная связка - rabbitmq + reddis.
Наличие на питоне решений вроде pywebkit и selenium - только на пользу, если захотитие на них переписать rendering, чтобы не запускать отдальных exec.

Если же нет - можно через celery отдавать таски рабочим, а там локально на машинках использовать zerorpc, чтобы сохранить костяк кода на node.js. У zerorpc как раз бинды на питоне и node.js.

В идеале (имхо) js -> flask -> celery -> selenium, например.

kidcrash
19.03.2014, 01:05
А flask в качестве чего ?

machduck
19.03.2014, 02:50
Взамен express + node.js.

Ну нравится он мне.. :]

Ну и nginx reverse proxy перед ним поставить самособой, если не только для личного пользования.

Kribrum
21.03.2014, 09:03
Не для личного пользования.
Переписывать на Python - не вижу смысла - получится такая же каруселька, только с другими технологиями. А вот за celery - спасибо) Звучит интересно. Буду пробовать на выходных.