Можно ли запустить два dev_appserver.py для подключения к одному и тому же эмулятору хранилища данных Google Cloud? - PullRequest
0 голосов
/ 08 июня 2018

Вариант использования: я разрабатываю стандартное приложение appengine на python, и еще одно готовится.Я хотел бы, чтобы объекты из обоих приложений были в одном хранилище данных.Это возможно?

Когда я запускаю первый файл dev_appserver.py с флагом --support_datastore_emulator=true и с конкретным --datastore_path, команда gcloud beta emulators datastore env-init завершается неудачно с ERROR: (gcloud.beta.emulators.datastore.env-init) Unable to find env.yaml in the data_dir [~/.config/gcloud/emulators/datastore]. Please ensure you have started the appropriate emulator.

1 Ответ

0 голосов
/ 14 июня 2018

Да, это возможно, но вам нужно тщательно его настроить.

Первое, что нужно иметь в виду, это то, что только один процесс эмуляции (будь то сам эмулятор или сервер разработки) должен обрабатыватьВ некоторых каталогах эмуляции хранилища данных одновременное выполнение нескольких из них, скорее всего, приведет к повреждению данных, как вы, возможно, заметили, пытаясь запустить 2 сервера разработки, использующих один и тот же --datastore_path конфиг.эмулятор процесса обработки хранения dir.Вы не хотите, чтобы сервер (-ы) разработки, которые также могут или имеют собственную эмуляцию хранилища данных, но в автономном режиме, также обрабатывали этот каталог хранилища, поэтому вам не следует использовать для них параметр --datastore_path.Серверы разработки должны вместо этого просто общаться с процессом эмулятора хранилища данных для всех своих обращений к хранилищу данных.

Когда вы запустите процесс эмулятора хранилища данных, в его журнале вы увидите строку, определяющую переменную среды DATASTORE_EMULATOR_HOSTчто вам нужно передать всем серверам разработки, которым вы хотите предоставить общий доступ к этому экземпляру эмуляции хранилища данных:

[datastore] API endpoint: http://0.0.0.0:5555
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=0.0.0.0:5555
[datastore] 
[datastore] Dev App Server is now running.

Итак, установите эту переменную среды в оболочке (ях), где вы хотите запустить сервер (ы) разработки), затем запустите серверы только с этими опциями, связанными с хранилищем данных:

export DATASTORE_EMULATOR_HOST=0.0.0.0:555
[.../]dev_appserver.py --support_datastore_emulator=true ...

Этот env var - единственное, что вам не нужно для запуска gcloud beta emulators datastore env-init здесь, в журнале сервера вы должны увидетьстрока, подобная этой:

ПРЕДУПРЕЖДЕНИЕ 2018-06-14 13: 54: 41,238 api_server.py:581] Обнаруженная переменная среды DATASTORE_EMULATOR_HOST = 0.0.0.0: 5555, dev_appserver будет говорить с запущенным эмулятором Cloud Datastoreпо этому адресу.Datastore_path /some_path_you_may_have_used_before/datastore.db будет игнорироваться.Если вы хотите, чтобы хранилище данных сохранялось в /some_path_you_may_have_used_before/datastore.db, удалите DATASTORE_EMULATOR_HOST из переменных среды и перезапустите dev_appserver

Когда сервер разработки сделает первый доступ к хранилищу данных, вы увидите несколько записей в данных.Журнал эмулятора, например:

[datastore] Jun 14, 2018 10:02:53 AM io.gapi.emulators.grpc.GrpcServer$3 operationComplete
[datastore] INFO: Adding handler(s) to newly registered Channel.
[datastore] Jun 14, 2018 10:02:53 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[datastore] INFO: Detected HTTP/2 connection.

Если DATASTORE_EMULATOR_HOST не указывает на работающий процесс эмулятора хранилища данных (или что-то не так с его связью), вы увидите ошибки на сервере разработкижурналы, вероятно, аналогичные этим:

ERROR    2018-06-14 14:39:08,026 api_server.py:373] Exception while handling datastore_v3.Get()
Traceback (most recent call last):
  File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 333, in _handle_POST
    response = service_stub.MakeSyncCallForRemoteApi(request)
  File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/google/appengine/tools/devappserver2/datastore_grpc_stub.py", line 190, in MakeSyncCallForRemoteApi
    request_pb, _TIMEOUT)
  File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/lib/grpcio-1.9.1/grpc/_channel.py", line 487, in __call__
    return _end_unary_response_blocking(state, call, False, deadline)
  File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/lib/grpcio-1.9.1/grpc/_channel.py", line 437, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
_Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Connect Failed)>

Более подробная информация по адресу:

ПРИМЕЧАНИЕ: что (по крайней мере, в настоящее время) только сервер разработки Google Cloud SDK (последняя версия, которую я тестировал с 204.0.0)поддерживает общение с автономным эмулятором хранилища данных, SDK, специфичный для GAE, не поддерживает (или, по крайней мере, 1.9.69 python, который я сейчас использую, делаетesn't).От Миграция до эмулятора облачного хранилища данных :

Примечание: Для этой миграции требуется использовать Google Cloud SDK на основе инструментов .

...