我目前正在构建一个向用户发送事务性电子邮件的 API。我使用作业队列(特别是 bull)来实现这一点。在开发过程中,我突然想到了一个问题:这些作业实际上是在哪里执行的?目前,我通过 bull 将这些作业发送到计算机上的 docker 容器中运行的 redis 数据库。我的第一个想法是这些作业在 redis 容器中运行,但我认为这不是真的,因为该 redis 容器没有运行 NodeJS,而 NodeJS 正是我用于 API 的。
我认为这些作业实际上是在创建它们的同一台机器上执行的。但是,如果是这样的话,那么作业队列有什么好处呢?我认为作业队列的目的是将任务委托给其他东西,这样 API 就不会因为发送所有这些电子邮件而变慢。据我所知,现在发生的一切只是通过向 redis 发送和接收作业来延迟任务。
我对作业队列还不太熟悉。希望我已经把我的情况描述得足够清楚了。
谢谢。
答案1
作业队列用于记录工作项。
队列处理可以选择由独立于应用程序其余部分的线程来完成。这对于在后台进行异步处理非常有用,可以充分利用多个 CPU。
耐用性也很有用。如果在应用程序重新启动后仍需要发送排队的电子邮件,则存储就变得必不可少。这实际上并不容易实现。
即使从应用服务器处理,队列仍然有用。取决于所需的功能。
此实现使用远程数据库进行存储。因此,您可以随意编写工作服务(使用 bull)并在单独的容器中运行它。
- 主应用程序容器
add
是一个工作项并且继续前进。 - 队列接收它,Redis 提供存储。
- 工作容器
process
会调用它并执行操作。增加concurrency
以使其并行调用多次。