alive_in_rain
Окт. 5, 2010 16:59:04
Всем привет,
возникла задача соорудить небольшой xml-rpc сервер. Что нужно – собственно, сам xml-rpc сервер,
логирование, юниттесты (для разной серверной бизнес-логики), orm.
Я довольно быстро соорудил каркас приложения с помощью стандартного xmlrpc сервера,
стандартного логирования, стандартных юнит-тестов и Storm-orm (который мне пока не очень нравится,
видимо надо будет попробовать sqlalchemy).
В development-режиме сервер запускается с помощью SimpleXMLRPCServer::serve_forever
Все в первом приближении вроде бы работает. Но долго так продолжаться не может,
и рано или поздно, приложение придется отправлять в продакшн.
По этому возникает вопрос, как лучше все вышеописанное деплоить на реальный сервер.
Я не очень разбираюсь в этой области, но почитав интернет пришел к выводу, что
мне может подойти nginx + fastcgi, или nginx + wsgi, но как в этой связке использовать
SimpleXMLRPCServer не очень понятно. Нашел такой класс как CGIXMLRPCRequestHandler,
подойдет ли он для fastcgi? Что лучше использовать fastcgi, или wsgi?
Еще, наверное совсем глупый вопрос – как быть с логами? Ведь если приложение будет
выполняться одновременно несколькими процессами, то надо будет как-то разделять
log-файлы…
Заранее спасибо за ответы:)
goblin_maks
Окт. 5, 2010 17:33:44
работая на проэкте где используется xmlrpc в потоках, скажу что используется один лог файл, с апачевским синтаксисом, покажу пару строк из лога,
[20101005-07:00:56.06 p:15089.1 u:- l:DBG] <XML_PARSE> URL: /db/
[20101005-07:00:56.06 p:15089.1 u:1001 l:INF] <FUNC_PARSE> select_user
[20101005-07:00:56.07 p:15089.1 u:1001 l:DBG] <FUNC_RUN> select_user
[20101005-07:00:56.07 p:15159.1 u:- l:DBG] <XML_PARSE> URL: /db/
[20101005-07:00:56.07 p:15159.1 u:1013 l:INF] <FUNC_PARSE> select_user
[20101005-07:00:56.07 p:15159.1 u:1013 l:DBG] <FUNC_RUN> select_user
[20101005-07:00:56.07 p:15089.1 u:1001 l:DBG] <SQL> Retrying to execute select. Attempt 1
[20101005-07:00:56.07 p:15089.1 u:1001 l:DBG] <SQL> EXECUTE SELECT * FROM users ua, pods p WHERE user_id = :1 USE 1001
[20101005-07:00:56.12 p:15159.1 u:- l:DBG] <-> ----------------------------------------
[20101005-07:00:56.11 p:15159.1 u:1013 l:DBG] <SQL> Retrying to execute select. Attempt 1
[20101005-07:00:56.12 p:15159.1 u:1013 l:DBG] <SQL> EXECUTE SELECT * FROM users ua, pods p WHERE user_id = :1 USE 1013
[20101005-07:00:56.13 p:15159.1 u:- l:DBG] <-> ----------------------------------------
таким образом лог легко грепается по ‘u:1013’ что есть некий user_id, либо по ‘p:15159.1’ что есть некий индикатор процесса, некоторые строки меняют свой порядок в логе, но только из за того что это потоки, flush выполняется для всех буферов одновременно, или как то так.
alive_in_rain
Окт. 5, 2010 17:41:33
goblin_maks, я немного не об этом, или же чего-то не понимаю:)
Смысл в чем, вот есть у меня мое приложение. В случае fast_cgi (если я правильно понимаю), каждый инстанс приложения обрабатывается отдельным питоновским процессом. Т.е. есть у меня нагрузка 100 запросов в секунду, получается что будут запущены 100 питоновских процессов, каждый из которых будет обслуживать свой инстанс моего приложения. А приложение пишет server.log и этот лог получается общим, для этих 100 инстансов приложений. Соответственно возникает вопрос, не возникнет ли здесь каких коллизий.
zheromo
Окт. 5, 2010 17:52:27
Если с nginx то однозначно fcgi, я обычно использую python-fastcgi, работает быстрее flup.
import fastcgi
s = fastcgi.ThreadedWSGIServer(application, workers=10)
s.serve_forever()
Так как wsgi для nginx накатывается в виде патча и работает вообще нипонять как.
Можно еще посмотреть в сторону wsgi-xmlrpc.
class Methods(object):
def test_1(self):
return u'test_1'
def test_2(self, value):
return value
application = wsgi_xmlrpc.WSGIXMLRPCApplication(instance=Methods())
ziro
Окт. 7, 2010 09:33:34
Еще можно посмотреть в сторону pylons - он из коробки умеет xml-rpc, а сам представляет собой обычный WSGI на основе WebOb, ну и проблем с ORM быть не должно, по крайней мере с sqlalchemy точно. Ставить на nginx через uwsgi (в 0.8 ветке ставится по умолчанию).
Также можно посмотреть еще Flask - у него тоже есть расширения для поддержки как для xml-rpc так и для sqlalchemy. Это также WSGI.
alive_in_rain
Окт. 7, 2010 10:53:23
Спасибо за информацию, продолжаю разбираться, скоро будут еще вопросы, наверное:)