代码之家  ›  专栏  ›  技术社区  ›  nilleb

是否可以启动两个dev_appserver.py连接到同一个google云数据存储模拟器?

  •  2
  • nilleb  · 技术社区  · 6 年前

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

    当我用标志启动第一个dev_appserver.py时 --support_datastore_emulator=true ,并使用 --datastore_path , the 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 回复  |  直到 6 年前
        1
  •  2
  •   Dan Cornilescu    6 年前

    是的,这是可能的,但是你需要小心地设置它。

    首先要记住的是,只有一个仿真进程(无论是仿真程序本身还是开发服务器)应该处理某个数据存储仿真目录,同时运行其中的多个进程很可能会导致数据损坏,正如您可能观察到的那样,尝试运行两个共享相同的开发服务器 --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变量是唯一不需要运行的东西 gcloud beta emulators datastore env-init 在这里, 在服务器日志中,您应该看到这样一行:

    警告2018-06-14 13:54:41238 api_server.py:581]检测到环境变量datastore_emulator_host=0.0.0:5555,dev_appserver将与在此地址上运行的云数据存储仿真程序对话。datastore_path/some_path_you_may_have_used_before/datastore.db将被忽略。 如果要将数据存储存储在/some_path_上,则在/datastore.db之前可能已使用过数据存储,请从环境变量中删除数据存储模拟器主机,然后重新启动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.
    

    如果 数据存储模拟器主机 不指向正在运行的数据存储仿真程序进程(或与它的通信有问题),您将在开发服务器的日志中看到错误,可能与以下内容类似:

    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 )支持与独立的数据存储仿真器对话,GAE特定的sdk不支持(或者至少 1.9.69 我现在使用的python一个没有)。从 迁移到云数据存储仿真程序 :

    注: 此迁移需要使用 Google Cloud SDK-based tooling .