首页 > 解决方案 > 是否可以启动两个连接到同一个谷歌云数据存储模拟器的 dev_appserver.py?

问题描述

用例:我正在用 python 开发一个 appengine 标准应用程序,另一个正在开发中。我希望将两个应用程序中的实体放在同一个数据存储中。那可能吗?

--support_datastore_emulator=true当我使用 flag和 specific启动第一个 dev_appserver.py 时--datastore_pathgcloud 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.

标签: google-app-enginegoogle-cloud-datastore

解决方案


是的,这是可能的,但您需要仔细设置。

首先要记住的是,只有一个仿真进程(无论是仿真器本身还是开发服务器)应该处理某个数据存储仿真目录,同时运行多个仿真进程很可能会导致数据损坏,正如您可能已经观察到的那样试图运行 2 个开发服务器共享相同的--datastore_path配置。

因此,您只需要一个数据存储模拟器进程来处理存储目录。您不希望开发服务器(它们也能够或运行自己的数据存储仿真,但以独立方式)也处理该存储目录,因此您不应该--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.

因此,在要启动开发服务器的 shell 中设置该环境变量,然后仅使用这些与数据存储相关的选项启动服务器:

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)>

更多信息在:

注意:(至少目前)只有谷歌云 SDK 开发服务器(我测试过的最新版本204.0.0)支持与独立的数据存储模拟器通信,GAE 特定的 SDK 不支持(或者至少是1.9.69我的 python) m 目前使用不)。从迁移到 Cloud Datastore 模拟器

注意:此迁移需要使用基于Google Cloud SDK 的工具


推荐阅读