Как сделать сервер расчетов

tel7432545

Всем привет, подскажите, кто знает.
Есть приложение, состоящее из оболочки и решателя. Хочется решатель запускать на сервере, обращаясь туда через интернет из оболочки. При запуске передается пара килобайт параметров, результат расчета десятки килобайт, расчет проводится пару минут на одном процессоре. Решатель написан на java или может запускаться как exe шник. Объемы расчетов не более 5 одновременных заданий от разных клиентов.
С помощью каких технологий можно просто это реализовать?
На что обратить внимание при развертывании сервера?
Спасибо за помощь

marat7256

Многое зависит от того, каким образом сейчас общаются между собой оболочка и решатель.

istran

CGI

tel7432545

просто через текстовые файлы общаются, но можно и переделать

katrin2201

Просто накидаю слов, там дальше сами разбирайтесь:
tcp, rpc/rmi, mq(zeromq,rabbitmq web services (jaxws finagle, thrift
В вашем конкретном случае быстрее всего на чистых сокетах будет написать, думаю.

marat7256

Так передаются данные, насколько я могу понять.
А как происходит запуск решателя и определение момента окончания его работы?

powermouse

просто напиши вебсервер на PHP

marusya68

В вашем конкретном случае быстрее всего на чистых сокетах будет написать, думаю.
Быстрее всего будет поднять HTTP сервер и набросать скрипты на PHP как указал forbidden

luna89

Как я понял, используется винда. Можно запускать программы удаленно через PowerShell. Для настройки сервера требуются тайные windows знания.

tel7432545

я не увидел слова soap?

NataNata

на питоне написать, естественно. См multithreaded tcp python server и библиотеку requests.
Это работает: за два дня с помощью stack overflow написал простейшую систему, которая сейчас гоняет вычисления на дюжине машин, при том, что в питоне был не ахти

tel7432545

Спасибо, тоже смотрел в сторону питона - попробую, если что поспрашиваю

luna89

tcp, rpc/rmi, mq(zeromq,rabbitmq web services (jaxws finagle, thrift

CGI

просто напиши вебсервер на PHP

soap

multithreaded tcp python server и библиотеку requests.

Я правильно понимаю, что если не винда, то достаточно ssh?
Спасибо Гейтсу за весь вышеперечисленный мусор.

katrin2201

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

istran

Ох, я думал "оболочка работающая через интернет" это веб-интерфейc.
Через ssh можно конечно что-нибудь простенькое сделать, но как я понимаю тут другой случай (есть клиенты, видимо каждый со своим ключом, лимит job-ов на одного клиента, и т.д.). Ну и решение через ssh на несколько машин не расширяется.

viktor954

и решение через ssh на несколько машин не расширяется.
Why?
От простейшего roundrobbin DNS
До более тонких решений:
http://greg.porter.name/wordpress/?p=83
Если же вопрос в раскидывании приходящих задач по нескольким машинам — то тут вопрос, скорее, к механизму самой "считалки".

luna89

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

Ivan8209

> При запуске передается пара килобайт параметров,
> результат расчета десятки килобайт,
> расчет проводится пару минут на одном процессоре.
Пока они тут обсуждают странные методы, я всё же хотел бы узнать,
в чём проблема передать всё это через POST и выложить результат
на отдельной страничке?
---
"Прогресс науки обратно пропорционален числу выходящих журналов."

istran

Ставишь пользователю, созданному на предыдущем этапе, в качестве шелла программу, которая понимает одну команду
Программу надо написать, как я понимаю. По трудозатратам и надежности это будет не лучше решения с HTTP ручкой и скриптом на python/PHP/whatever, которое тут все предлагают. Фактически ты предлагаешь заменить HTTP на SSH.

luna89

Пока они тут обсуждают странные методы, я всё же хотел бы узнать,
в чём проблема передать всё это через POST и выложить результат
на отдельной страничке?
Во-первых, я не хочу добавлять http клиент в оболочку решателя.
Во-вторых, я не хочу устанавливать и администрировать вебсервер с PHP или питоном.

luna89

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

tel7432545

у добавлять http клиент в оболочку решателя.
Во-вторых, я не хочу устанавливать и администрировать вебсервер с PHP или питоном.

addict
Рег.: 23.11.2007
Сообщений: 666
Рейтинг: 90
  Re: Как сделать сервер расчетов [re: ]
      05.02.2015 19:11
 
         
В ответ на:
Ставишь пользователю, созданному на предыдущем этапе, в качестве шелла программу, которая понимает одну команду - запустить задачу. Эта программа перед запуском должна делать все необходимые проверки.
Если никаких проверок не требуется, то можно установить в качестве шелла сам решатель.
Решатель - exe файл, Оболочка для клиента написана на Delphi. Можно поподробнее Ваше решение. Спасибо.

luna89

Решатель - exe файл, Оболочка для клиента написана на Delphi. Можно поподробнее Ваше решение. Спасибо.
Примерное решение, точнее скажет программист на windows
1)Учим решатель читать данные из стандартного входного потока, а не только указанного файла.
2)Создаем на сервере специального пользователя, из-под которого будет запускаться программа.
3)Устанавливаем на сервер решатель.
4)Включаем PSRemoting - стандартное средство windows для запуска программ на удаленном компьютере.
http://technet.microsoft.com/en-us/library/hh849694.aspx
5)Как я понимаю, сейчас оболочка решателя запускает сам решатель - exe программу.
Надо, чтобы она запускала такую команду (очень приблизительно).
 
PowerShell.exe -Command "invoke-command --ConnectionUri http://myserver.ru:5432 -ScriptBlock { reshatel.exe }"

http://technet.microsoft.com/en-us/library/hh849719.aspx
В stdin процессу пишем данные.

zya369

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

cera1

присоединясь, форбидден, леонард и Контра дело говорят - надо поднять веб-сервер и написать скрипты, которые будут методом POST принимать данные и отправлять результаты.

zya369

если будут еще сомнения по поводу того, чтобы сделать как говорит ддд2, то подумай о том, что ценой ошибки в настройке (которая, на мой взляд, нетривиальна) может стать "слив" твоего решателя и прощай клиент (хорошо еще если только один).
например, если я правильно понял как это в винде устроено, то замена
PowerShell.exe -Command "invoke-command --ConnectionUri http://myserver.ru:5432 -ScriptBlock { reshatel.exe }"  

на
 PowerShell.exe -Command "invoke-command --ConnectionUri http://myserver.ru:5432 -ScriptBlock { type reshatel.exe }" 

просто отдаст твой решатель

Ivan8209

Я не согласен с твоей оценкой.
Разумеется, этот подход в винде не очень традиционен,
сам автор признаёт, что это калька с уникса, но это вопрос
однократной настройки. По сути, ты утверждаешь, что если
в inetd.conf вставить лишний "/bin/cat", то ты будешь
отдавать программу, а не запускать её. Так это и без того
понятно, "не делай так."
---
A44: Ламеры в гамаке пусть в тапках трахаются --- это их проблемы.
Я в своём гамаке хочу полноценно трахаться на лыжах.

Dasar

Эта строка запускается на клиенте, а не на сервере.

Ivan8209

А, ну тогда это действительно говно.
Так можно вместо "reshatel.exe" и "rm -rf /" написать.
---
Q6: Я слышал есть такой мужик, вроде Бармин зовут, и он
придумал что-то такое после чего XXX не сосет.

luna89

А, ну тогда это действительно говно.
Так можно вместо "reshatel.exe" и "rm -rf /" написать.
Во-первых, ты не напишешь rm -rf из-под обычного пользователя.
Во-вторых, в powershell есть возможность restricted sessions, в которых есть только заранее предопределенный набор действий.
В случае с PHP решением неясно, как делать аутентификацию. Мое решение хорошо тем, что не надо модифицировать оболочку - при попытке выполнить команду удаленно у тебя вылезет системное windows окно с запросом credentials. В случае, если все машины в одном домене, то из коробки будет работать single sign on.

Ivan8209

> Во-первых, ты не напишешь rm -rf из-под обычного пользователя.
Напишешь-напишешь. То, что удалятся данные только этого пользователя,
ничем не лучше удаления всей системы.
> Во-вторых, в powershell есть возможность restricted sessions,
> в которых есть только заранее предопределенный набор действий.
CGI и аналоги (если написаны без дыр) выполняют только то, что задано.
> В случае с PHP решением неясно, как делать аутентификацию.
HTTP её поддерживает изначально.
> Мое решение хорошо тем, что не надо модифицировать оболочку -
> при попытке выполнить команду удаленно у тебя вылезет системное
> windows окно с запросом credentials. В случае, если все машины
> в одном домене, то из коробки будет работать single sign on.
Если правильно настроить, то и в униксах HTTP не будет пароль
спрашивать, так как будет работать тот же самый "single sign-on,"
что и в винде, так как цербер в винде такой же.
---
A39: Сдуру можно много чего сломать

luna89

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

zya369

у тебя вылезет системное windows окно с запросом credentials
ништяк, еще и пароли поподбирать можно будет :D
Во-вторых, в powershell есть возможность restricted sessions, в которых есть только заранее предопределенный набор действий.

ну-да... настройки, настройки, найтройки
ЗЫ что предлагаешь делать с обрывами связи во время активной сессии?

luna89

ЗЫ что предлагаешь делать с обрывами связи во время активной сессии?
В простейшем случае, делать реконнект и пускать задачу повторно. В более сложном случае, у powershell есть сессии, которые живут на сервере при обрыве соединения (как GNU screen).
А в чем принципиальная разница по сравнению с http? Как ты в http будешь обрабатывать обрывы?

Dasar

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

zya369

в http нечему рваться: 1 запрос на постановку потом проверяешь доступность результатов

Dasar

ты предлагаешь stateful api, что само по себе тоже не подарок.

zya369

ты предлагаешь stateful api, что само по себе тоже не подарок.

да вроде не особо
проверяем появился ли файл с результатами или нет
чистить правда еще надо будет, но тут крон спасет )
Оставить комментарий
Имя или ник:
Комментарий: