Запуск нескольких сервисов с использованием dev_appserver.py на разных портах

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

Я хочу, чтобы REST и WEB-сервис работали локально, используя dev_appserver.py

Я пробовал следующее

dev_appserver.py rest_app.yaml --port=5010 --admin_port=8000

dev_appserver.py web_app.yaml --port=5011 --admin_port=8001

Я вижу следующую ошибку на одном из моих сервисов (служба отдыха)

`OperationalError: database is locked`

Нужно ли делать что-то особенное, чтобы обе эти службы могли читать / записывать в общую базу данных без каких-либо условий (или подобных плохих вещей!!)

Моя цель - запускать несколько сервисов (в данном случае отдых и сеть) локально, и эти сервисы должны предоставлять данные. Каков наилучший способ сделать это (используя dev_appserver.py локально) и в самом GAE (это произойдет позже, когда я отправлю свое приложение в GAE:D)

1 ответ

Причина, по которой вы получаете OperationalError: database is locked это что 2 dev_appserver.py экземпляры будут сталкиваться при попытке доступа к одной и той же папке локального хранилища базы данных, которая по умолчанию определяется на основе имени приложения - идентично для 2 служб одного и того же приложения.

Одним из способов избежать такого столкновения является также указание каталога локального хранилища, используя dev_appserver.py"s --storage_path необязательный аргумент (который вы можете увидеть через dev_appserver.py --help):

--storage_path PATH   path to the data (datastore, blobstore, etc.)
                      associated with the application. (default: None)

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

Правильный способ использования dev_appserver.py с несколькими службами одного приложения, чтобы запустить все службы через один dev_appserver.py экземпляр, который будет выделять разные порты для каждой службы.

Например, у меня есть приложение с 3 службами, использующее файл отправки. Вот так я вызываю сервер dev из каталога dir приложения, который является родительским dir для 3 dir службы (файл рассылки должен быть первым в списке .yaml Аргументы файла, и я всегда следую за этим с модулем по умолчанию, в моем случае main/main.yaml):

/usr/bin/python2.7 /usr/local/google_appengine/dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml apartci/apartci.yaml

И вот как devserver автоматически назначает порты, которые слушает каждая служба, отображаемые при запуске сервера:

INFO     2016-11-18 14:20:53,329 api_server.py:205] Starting API server at: http://localhost:40310
INFO     2016-11-18 14:20:53,330 dispatcher.py:185] Starting dispatcher running at: http://0.0.0.0:8080
INFO     2016-11-18 14:20:53,345 dispatcher.py:197] Starting module "default" running at: http://0.0.0.0:8081
INFO     2016-11-18 14:20:53,353 dispatcher.py:197] Starting module "buildin" running at: http://0.0.0.0:8082
INFO     2016-11-18 14:20:53,361 dispatcher.py:197] Starting module "apartci" running at: http://0.0.0.0:8083
INFO     2016-11-18 14:20:53,362 admin_server.py:116] Starting admin server at: http://localhost:8000
Другие вопросы по тегам