Старый 18.03.2014, 09:52   #1
Kribrum
 
Регистрация: 14.06.2012
Сообщений: 13
Репутация: 2
По умолчанию Выбор языка

Добрый день уважаемые.
Никогда не думал, что буду задавать этот вопрос, однако понимание что называется, приходит с опытом Опыт уже имеется, а вот в понимании рассчитываю на Вас.
Суть проблемы:
- Есть бот, написанный на 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. Очевидный вариант - обновить машину до более мощной - пожалуйста не предлагайте. Ибо мощности - тоже предельны как оказалось=\
Kribrum вне форума   Ответить с цитированием
Старый 19.03.2014, 00:29   #2
machduck
 
Аватар для machduck
 
Регистрация: 24.02.2014
Сообщений: 4
Репутация: 0
По умолчанию

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

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

В идеале (имхо) js -> flask -> celery -> selenium, например.
machduck вне форума   Ответить с цитированием
Старый 19.03.2014, 02:05   #3
kidcrash
 
Регистрация: 17.09.2013
Сообщений: 11
Репутация: 0
По умолчанию

А flask в качестве чего ?
kidcrash вне форума   Ответить с цитированием
Старый 19.03.2014, 03:50   #4
machduck
 
Аватар для machduck
 
Регистрация: 24.02.2014
Сообщений: 4
Репутация: 0
По умолчанию

Взамен express + node.js.

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

Ну и nginx reverse proxy перед ним поставить самособой, если не только для личного пользования.
machduck вне форума   Ответить с цитированием
Старый 21.03.2014, 10:03   #5
Kribrum
 
Регистрация: 14.06.2012
Сообщений: 13
Репутация: 2
По умолчанию

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

Метки
gekko, серверный js, spooky, webkit, welcome to hell

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot