在 App Engine 上使用 node.js,是使用任务队列更好还是 pub/sub

with node.js on app engine, is it better to use task queues or pub/sub

我们一直在将 API 从 python 转移到节点。我们在 Python 应用引擎 API 中使用了任务队列。 App Engine 现在支持 node.js,您是否建议我们使用任务队列或云 pub/sub 来处理任务?各自的优点/缺点是什么,包括可靠性、便携性等。

任务队列和 Pub/Sub 具有不同的消息传递模型,因此适用于不同的事物。 Pub/Sub 使用发布者-订阅者模型,Task Queue 收集任务并将其分发给工作人员。

使用Pub/Sub分配任务不如使用任务队列自然。 Pub/Sub 主题的所有订阅者都可以看到所有消息,而在任务队列中,一条消息仅由一个接收者使用。另一方面,任务队列并不是为了广播消息而设计的。

目前,任务队列在 App Engine 上运行得最好。尽管有一个实验性的任务队列 REST API,但任务队列是 App Engine 原生的,并且在 App Engine 上运行得最好。 Pub/Sub 可以在任何地方使用。虽然任务队列任务会自动分发到 App Engine 实例,但您需要进行额外的设置才能使用 Pub/Sub 进行应用程序内部通信。

任务队列还提供特殊功能,例如延迟消息。

编辑:

不幸的是,Node.js App Engine 运行时似乎推送任务队列尚未准备就绪。

Kamal 在下面指出的 Pub/Sub 解决方案是模拟基于拉取的负载平衡的一个很好的技巧。如果您对拉模式没问题,使用 Pub/Sub 可能是正确的方法,但我想明确表示 AE 任务队列 API 可用于 (https://github.com/google/google-api-nodejs-client/tree/master/apis) node.js 使用 pull.

使用拉取还是推送需要考虑的一件事是重试策略略有不同。任务队列项可以配置为无限期重试,而我认为 Pub/Sub 如果在 7 天后未确认消息,将停止尝试传递消息。

如果您决定使用 PubSub 推送模式,需要考虑的其他事项是:

  • AE 任务队列的某些功能,例如延迟消息或配置具有特定重试或生存时间设置的消息在 PubSub 中不可用
  • 您需要知道您希望使用队列中任务的实例的端点。

在单独的注释中(针对下面的第一个响应),看起来确实支持内存缓存集成。它有一个位于 https://cloud.google.com/appengine/docs/flexible/nodejs/caching-application-data.

的文档页面