google-app-engine - 是否可以启动两个连接到同一个谷歌云数据存储模拟器的 dev_appserver.py?
问题描述
用例:我正在用 python 开发一个 appengine 标准应用程序,另一个正在开发中。我希望将两个应用程序中的实体放在同一个数据存储中。那可能吗?
--support_datastore_emulator=true
当我使用 flag和 specific启动第一个 dev_appserver.py 时--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.
解决方案
是的,这是可能的,但您需要仔细设置。
首先要记住的是,只有一个仿真进程(无论是仿真器本身还是开发服务器)应该处理某个数据存储仿真目录,同时运行多个仿真进程很可能会导致数据损坏,正如您可能已经观察到的那样试图运行 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 的工具。
推荐阅读
- python - 无法将正确的格式应用于熊猫日期框
- c - 管道和控制台的区别
- android - 什么是 provideLayout()?.let { setContentView(it) }?
- powershell - 为什么Powershell运行的应用程序没有出现在远程桌面上,而是出现在任务管理器中?
- scala - 如何将字符串序列添加为 dataFrame 上的列并进行转换
- node.js - 反应拆分数组中的字符串
- javascript - 最长递增子序列 (Javascript) Facebook 算法
- pandas - 如果另一列包含一个单词,Pandas 数据框从某列中选择行值
- android - 如何为 Android Studio 3.6 或更高版本创建自定义项目模板?
- amazon-web-services - Amazon S3 中的 GET 请求是什么