Pub/Sub:似乎无法让本地模拟器与 Node.js 一起使用

Posted

技术标签:

【中文标题】Pub/Sub:似乎无法让本地模拟器与 Node.js 一起使用【英文标题】:Pub/Sub: Can't seem to get local emulator working with Node.js 【发布时间】:2017-11-02 12:44:20 【问题描述】:

我在以下链接中读到,我必须使用以下命令在本地启动一个 pub/sub 实例:gcloud beta emulators pubsub env-init && gcloud beta emulators pubsub start:

https://cloud.google.com/pubsub/docs/emulator

这很好,实例已启动并正在运行。

我不明白的是,当我启动 node.js 应用程序时,它似乎没有与这个实例交互。

我能够获得以下工作 pub/sub 模拟器实例在本地运行:

  const subscription = pubsub.subscription(topicName);
  // Register a listener for `message` events.
  subscription.on('message', (message) => 
    console.log('->', message);
  );
  const results = await pubsub.topic('my-new-topic').publish('my message');
  const messageIds = results[0];
  console.log(`Message $messageIds[0] published.`);

我认为它可能会与我在云上的项目发生冲突,但是因为我还运行了 gcloud beta emulators pubsub env-init,它应该使用本地项目。如前所述,即使我没有启动它,它似乎也能正常工作。

我想知道我是否误解了它在本地开发中的工作方式。以下是我读到的。

    创建项目 启用发布/订阅 下载 SDK 安装并初始化 在 Node.js 应用程序中安装 NPM 库 通过gcloud beta emulators pubsub env-init设置环境变量 通过gcloud beta emulators pubsub start启动本地发布/订阅模拟器 启动 Node.js 应用程序,观察它的连接、获取主题、发布、订阅等。

我希望谷歌有时会做一个简单的项目符号列表,让深度阅读成为可选的。

这是它的外观:

karl@karl-Dell-Precision-M3800:~/dev/node(dev/feat/setup)$ ps aux | grep pubsub
karl     19538  0.0  0.0   4512   848 pts/1    S+   14:52   0:00 /bin/sh /opt/google-cloud-sdk/bin/gcloud beta emulators pubsub start --verbosity=info
karl     19545  1.2  0.2  88796 32760 pts/1    S+   14:52   0:00 python2 -S /opt/google-cloud-sdk/lib/gcloud.py beta emulators pubsub start --verbosity=info
karl     19570  4.0  0.3 6982280 64888 pts/1   Sl+  14:52   0:00 /usr/lib/jvm/java-8-oracle//bin/java -jar /opt/google-cloud-sdk/platform/pubsub-emulator/lib/cloud-pubsub-emulator-0.1-SNAPSHOT-all.jar --host=localhost --port=8085

【问题讨论】:

【参考方案1】:

一般情况下需要运行

$ gcloud beta emulators pubsub start
$ $(gcloud beta emulators pubsub env-init)

在您启动 Node 应用程序之前。

env-init 命令将导出一个环境变量 (PUBSUB_EMULATOR_HOST),该变量将由 Node 应用程序中的 Nodejs PubSub 客户端库自动获取,使其连接到模拟器而不是全局 Google Cloud Pubsub。

要验证您的应用程序是否看到此变量,您可以添加如下内容:

assert(process.env.PUBSUB_EMULATOR_HOST);

在您创建 PubSub 实例时。

注意:

pubsub start 应该发生在env-init 之前,因为后者取决于前者选择的动态端口 env-init定义的环境变量需要注入到本地终端,这样你的Nodejs应用才能看到。这就是为什么我们需要将它包装在 bash $() 语法中。

(不幸的是,测试 Nodejs push endpoints with the PubSub emulator via functions-framework is broken,因此根据您与 PubSub 交互的方式,您可能需要调整本地测试策略。其他主题操作似乎按预期工作。)

【讨论】:

我也有同样的问题,上面的方法对我不起作用。在声明 2 个命令之后,我运行 npm run watch,但我看到它通过项目日志转到我的 gcloud 项目设置的任何位置。有什么帮助吗?

以上是关于Pub/Sub:似乎无法让本地模拟器与 Node.js 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Node.js、Socket.io、Redis pub/sub 大容量、低延迟困难

redis pub/sub 与 node.js 中的 socket.io

Google Cloud 上使用 Pub/Sub 的主/从模式

Google Cloud Functions 无法使用 Pub/Sub 死信主题

Google PubSub 模拟器是不是可以与 Google Cloud Pub/Sub API 客户端库一起使用?

ZeroMq PUB/SUB 模式无法正常工作