问题标签 [bullmq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - Heroku Node.js RedisCloud Redis::CannotConnectError 在 localhost 而不是 REDISCLOUD_URL
当我尝试将我的 Nodsjs 应用程序连接到 Heroku 上的 RedisCloud 时,我收到以下错误
我什至尝试在代码中直接设置redis URL和端口来测试它。但是,它仍然尝试连接到 Heroku 上的 localhost,而不是 RedisCloud URL。
node.js - Node Js:Redis作业在完成其任务后未完成
希望你们做得很好。
我在我的 nodejs 项目中实现了 BullMQ(Bull 的下一个主要版本)来安排发送电子邮件的作业。例如,发送忘记密码请求的电子邮件。所以,我写了我的代码,如下所示。
用户服务:
重置密码作业:
重置密码解析器:
但问题是,如果我执行一次并尝试执行其他作业,那么该作业只是在执行,没有最新的。并在控制台中收到错误消息:
我无法为这个错误找到任何具体的解决方案。请帮帮我。
感谢你们!
node.js - 尝试在 Ubuntu 20.4 上安装 Bull-repl,出现奇怪的 npm 错误
我正在尝试通过在我的 Ubuntu 20.4 系统上安装 Bull-repl 包
但我不断收到以下错误:
我试图清理 npm 缓存和另一篇关于类似问题的帖子中提到的其他一些东西。并且我尝试了消息中的解决方案:)
node.js - Bull 在给定的 cron 时间未触发可重复作业
我想使用 Bull NPM 并行执行一些数据处理,并在给定的 cron 时间开始处理每个作业
有什么建议可以达到同样的效果吗?
node.js - 从 BullMQ 完成的作业中检索结果的推荐方法是什么?
我正在使用带有快速服务器的 BullMQ 来异步处理作业,但对如何从已完成的作业中检索结果感到困惑。
我目前正在做的是监听作业完成状态事件并将这些结果存储在一个以作业 ID 为键的对象中,并在我需要时从该对象中检索结果。有推荐的方法吗?
我查看了BullMQ 文档,但找不到任何有关如何检索结果的信息。
这是示例代码:
服务器.js
工人.js:
node.js - 使用 node.js 和 Bullmq 部署 API 的流程布局
让我先说这个问题,我理解在这个话题上可能不会有一个明确的,是或否的答案,并且给出的答案可能是由意见驱动的。但是,我确实需要并感谢您在部署和操作以下 API 设计时提供的建议和/或指导。
我正在做什么
对于我的 SaaS,我想通过 API 向我的客户提供它的功能。SaaS 提供的任务是一项长期运行且计算成本高昂的任务。因此,不幸的是,运行一个简单的“同步”API,调用者等待这个任务的结果作为对他们请求的响应被传递是不合适的。相反,我选择了一种方法,调用者计划Jobs
并定期查询 API 以查看给定的作业是否已经完成。我对这个设计很满意。
到目前为止我做了什么
对于实施,我建立/使用了以下技术:
Node.js
服务器Express
用于 API 和路由的 npm 包Redis
作业调度数据库bullmq
用于 Redis 连接和队列管理的 npm 包
使用bullmq
,我创建一个Queue
并添加Jobs
到该队列以响应对给定端点的调用。
对我来说,这是api.ts
(缩短):
此外,我创建了处理计划作业的工作人员,由bullmq
包协调,Redis
在引擎盖下使用。
对我来说,这是worker.ts
(缩短):
我目前如何在我的开发环境中运行它
tsc
将 Typescript 编译为 Javascript。
我pm2
用作进程管理器和守护进程。要运行 api,我使用以下命令:
这将为每个可用的 cpu 内核启动一个节点进程(在我的开发机器上为 8 个)。
要运行工作人员,我打开另一个终端并执行:
我可以通过打开更多终端并重复上面的命令来添加工作人员。这样做会导致多个工人Jobs
从 中Queue
分担工作量并同时完成多个工作,从而更快。
所有这些在我的开发环境中都非常有效。
我不确定什么
我不知道的是当前的方法是否适合生产环境。我已经研究了文档pm2
,bullmq
但我似乎无法找到如何将这两者结合起来的明确描述。当然,我的目标是最大化性能和 API 吞吐量。
以下几点仍然是我脑海中悬而未决的问题:
- 实际上会在
pm2
每个可用核心上运行一个进程,即将某个核心分配给给定进程吗?或者它会产生与核心一样多的进程,并且较低级别的系统机制将负载平衡哪个核心的计算时间用于哪个进程。 - 如果是前者,我从我的 API 进程实例启动的子进程是否会分配给父进程正在运行的核心?
- 如上所述启动一个worker,我们可以提供一个
concurrency
选项,它会告诉bullmq 生成尽可能多的进程来运行worker 代码。并发性是否也仅限于分配给主要初始worker 进程的核心(以 开头node build/worker/worker.js
)。
鉴于我对上述几点的不确定性,我提炼了三种在生产环境中运行流程的方法:
启动 API 进程并使用
pm2 start -i max build/api/api.js
. 启动工作进程并使用pm2 start -i max build/worker/worker.js
. 这将使我每个可用核心有 1 个 api 进程和 1 个工作进程。我会假设这种方法可以优化 CPU 负载。但是,我不知道要为工人的concurrency
参数分配什么值。bullmq
将工作代码移动/导入到 API 进程。启动 API 进程并使用
pm2 start -i max build/api/api.js
. 这将给我留下 1 个进程,其中包括 api 和 worker,每个核心。在我看来,这里的缺点是 worker 和 api 是同一个进程,这意味着如果 api 部分导致进程由于某种原因崩溃,worker 会随之关闭。那是对的吗?启动 API 进程并使用
pm2 start -i max build/api/api.js
. 启动并妖魔化具有高参数值 (100+) 的单个工作进程concurrency
。假设并发工作进程被系统负载平衡到可用内核,这也应该会优化 CPU 利用率。不利的一面是,如果单个工作进程崩溃,则在恢复之前不会完成任何工作。
我的直觉告诉我方法 1. 在我的情况下是最好的。但是,这是我第一次将这种 node.js 应用程序部署到生产环境中。因此,我真诚地感谢对所描述项目的任何帮助、建议、指导或反馈。
node.js - BullMQ - 在服务器重启之间持久化作业排队和管理作业
任务的小背景——我正在为 Shopify 构建废弃的购物车回收系统。在用户结帐后,Shopify 调用我们的 webhook,并且 webhook 将该请求作为作业排入队列 A 中,延迟 5 分钟。当工作人员开始处理该作业时,它会检查该结帐是否已支付。如果尚未付款,则会向用户发送购物车恢复消息。
我正在使用 Node.js、Express.js、Redis 和 BullMQ 来实现服务器和排队系统。我试图通过 BUllMQ 的基本示例。在网上,找不到一些关于如何在生产级系统中使用它的高级示例。
现在,我被以下这些问题困住了——
由于 Redis 是内存数据库,我必须将每个传入的作业保存在我的 MongoDB 集合中,最初状态为 PENDING 并侦听完成事件以在数据库中将该状态更改为 COMPLETED。每当我的服务器重新启动时,我都会获取所有处于 PENDING 状态的作业并将它们添加到队列中。这样,即使 Redis 出现故障或重新启动,我们也可以恢复我们的工作。我的问题是 - 在生产级应用程序中做这样的事情有意义吗?,我应该在 MongoDB 中保存工作吗?& 在实施此流程时,我还应该注意哪些其他事项?
现在,Bull 队列(让我们将其命名为“A”)正在快速服务器中进行初始化。每次服务器重新启动时,队列 A 也会被初始化。我的问题是 - 是否重新初始化队列 A,删除 Redis 上的旧队列 A?围绕这个问题我还能做些什么?
对于这方面的任何帮助,我将不胜感激。
node.js - Bullmq 手动重试已完成的作业
我正在使用 bullmq 发送 webhooks 事件。已安排作业并进行自动重试。假设我想重新执行一些已经成功完成的任务,并且我有想要重新安排的队列中元素的 ID,是否可以通过将这些任务移动到等待队列中手动将它们设置为“重复”以某种方式与redis?
node.js - NestJS Fastify Bull Board 集成
我正在尝试将 Bull Board 集成到 NestJS + Fastify 服务中。
bull-board.middleware.ts
app.module.ts
Bull Board 依赖于具有不同请求接口的 Express 应用程序。仪表板实际上是可访问的,但提供静态文件失败。 浏览器+控制台截图
我试过了:
- 应用
fistify-express
适配器 => 导致 NestJS 出错 - 提供传递
basePath | proxyPath: 'admin/queues'
给req
bullBoardMiddleware
有人可以建议如何使其工作。
先感谢您!