我们一直在将我们的 api 从 python 移动到 node。我们在 Python 应用引擎 API 中使用了任务队列。随着应用引擎现在支持 node.js,您是否建议我们使用任务队列或云发布/订阅来执行任务?每种方法的优缺点是什么,包括可靠性、便携性等。
1 回答
任务队列和 Pub/Sub 具有不同的消息传递模型,因此对不同的事物有用。Pub/Sub 使用发布者-订阅者模型,而任务队列收集任务并将其分发给工作人员。
使用 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 时使用拉。
使用拉取还是推送要考虑的一件事是重试策略略有不同。任务队列项目可以配置为无限期重试,而我认为如果 7 天后未确认消息,Pub/Sub 将停止尝试传递消息。
如果您决定使用 PubSub 推送模式,需要考虑的其他事项是:
- AE 任务队列的某些功能(例如延迟消息或配置具有特定重试或生存时间设置的消息)在 PubSub 中不可用
- 您需要知道要使用队列中的任务的实例的端点。
在单独的注释中(响应下面的第一个响应),看起来确实支持 memcache 集成。它有一个位于https://cloud.google.com/appengine/docs/flexible/nodejs/caching-application-data的文档页面。