Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2010 16:59:04

alive_in_rain
От:
Зарегистрирован: 2010-05-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

Всем привет,

возникла задача соорудить небольшой xml-rpc сервер. Что нужно – собственно, сам xml-rpc сервер,
логирование, юниттесты (для разной серверной бизнес-логики), orm.

Я довольно быстро соорудил каркас приложения с помощью стандартного xmlrpc сервера,
стандартного логирования, стандартных юнит-тестов и Storm-orm (который мне пока не очень нравится,
видимо надо будет попробовать sqlalchemy).

В development-режиме сервер запускается с помощью SimpleXMLRPCServer::serve_forever
Все в первом приближении вроде бы работает. Но долго так продолжаться не может,
и рано или поздно, приложение придется отправлять в продакшн.

По этому возникает вопрос, как лучше все вышеописанное деплоить на реальный сервер.
Я не очень разбираюсь в этой области, но почитав интернет пришел к выводу, что
мне может подойти nginx + fastcgi, или nginx + wsgi, но как в этой связке использовать
SimpleXMLRPCServer не очень понятно. Нашел такой класс как CGIXMLRPCRequestHandler,
подойдет ли он для fastcgi? Что лучше использовать fastcgi, или wsgi?

Еще, наверное совсем глупый вопрос – как быть с логами? Ведь если приложение будет
выполняться одновременно несколькими процессами, то надо будет как-то разделять
log-файлы…

Заранее спасибо за ответы:)



Офлайн

#2 Окт. 5, 2010 17:33:44

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

работая на проэкте где используется 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 выполняется для всех буферов одновременно, или как то так.



Отредактировано (Окт. 5, 2010 17:37:19)

Офлайн

#3 Окт. 5, 2010 17:41:33

alive_in_rain
От:
Зарегистрирован: 2010-05-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

goblin_maks, я немного не об этом, или же чего-то не понимаю:)

Смысл в чем, вот есть у меня мое приложение. В случае fast_cgi (если я правильно понимаю), каждый инстанс приложения обрабатывается отдельным питоновским процессом. Т.е. есть у меня нагрузка 100 запросов в секунду, получается что будут запущены 100 питоновских процессов, каждый из которых будет обслуживать свой инстанс моего приложения. А приложение пишет server.log и этот лог получается общим, для этих 100 инстансов приложений. Соответственно возникает вопрос, не возникнет ли здесь каких коллизий.



Офлайн

#4 Окт. 5, 2010 17:52:27

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

Если с 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())



Офлайн

#5 Окт. 7, 2010 09:33:34

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

Еще можно посмотреть в сторону pylons - он из коробки умеет xml-rpc, а сам представляет собой обычный WSGI на основе WebOb, ну и проблем с ORM быть не должно, по крайней мере с sqlalchemy точно. Ставить на nginx через uwsgi (в 0.8 ветке ставится по умолчанию).

Также можно посмотреть еще Flask - у него тоже есть расширения для поддержки как для xml-rpc так и для sqlalchemy. Это также WSGI.



Офлайн

#6 Окт. 7, 2010 10:53:23

alive_in_rain
От:
Зарегистрирован: 2010-05-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нубские вопросы: xml-rpc сервер

Спасибо за информацию, продолжаю разбираться, скоро будут еще вопросы, наверное:)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version