问题标签 [bull]
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 - 能够从 Redis Bull Queue 数据中提供见解
我有一个应用程序对另一个系统进行 API 调用,它使用 Bull 和 Redis 将这些 API 调用排入队列。
但是,有时它会因大量 API 调用而陷入困境,或者某些东西停止正常工作,我希望用户可以通过一种简单的方法来检查系统是否只是“忙碌”。(否则,如果他们执行了某些操作,但 10 分钟后还没有完成,他们会继续尝试,然后我们会积压更多条目(在某些情况下,他们发布了重复部分的数据问题, ETC。)
以下是队列中成功调用 API 的单个“密钥”的样子:
您可以看到在这种情况下处理需要 83 秒。(1639085540 - 1639085623)
我希望能够提供汇总指标,例如:
- 最近的 API 调用在 X 秒前被添加到队列中
- 最近一次成功的 API 调用在 X 秒前完成,需要 XX 秒才能完成。
我还希望能够提供 50 个最近的 API 调用的列表,以一种很好的方式格式化并标记为“成功”、“待定”或“失败”。
我对 Redis 和 Bull 还很陌生,我试图弄清楚如何查询这些数据(在 Node.js 中使用 Redis)并将这些数据作为 JSON 返回给应用程序。
我可以拉一个这样的键列表:
这将返回 ["bull:webApi:3","bull:webApi:1","bull:webApi:2"...]
但是我怎样才能拉出与各个键关联的值呢?
以及如何找到数字最高的密钥,然后拉出“最后 50 个”的详细信息。在 SQL 中,这就像执行ORDER BY key_number DESC LIMIT 50 - 但我不确定如何在 Redis 中执行此操作。
node.js - 有没有办法在将环境加载到公牛作业的子进程时将命令行参数传递给节点进程?
我需要传递命令行参数或参数或 execargv,它们应该在为子进程加载环境时出现在进程参数中,该子进程将由公牛启动以处理作业。
可能吗?如果是,有什么办法吗?
我可以使用包含/bull/lib/process的 args[1] 识别为公牛启动的子进程, 但我想将自定义参数传递给节点进程。
javascript - 获取bulljs中可重复作业的迭代位置
例如,我想在可重复作业回调中的某个位置执行一些操作
javascript - Bull js 阻止 express api 请求,直到作业完成
我有一个运行Bull and express 的作业服务器。
服务器要求
接收包含对象的请求并将该对象用作本地程序的输入(别无选择),该程序需要几分钟到几个小时才能运行。作业必须按照收到的顺序一个接一个地运行(不能绕开这个)。
TL;DR 服务器:
问题:
- 当我将数据发送到这条路线时,一切都按预期工作。作业开始,我从服务器收到“作业成功排队”。
- 当我第二次向服务器发送数据时(前一个作业仍在运行),路由中的 console.log 不会触发,并且请求会挂起,直到现有作业完成。一旦现有作业完成,请求就会得到确认,并且下一个作业会排队。
我尝试过的事情:
使用 spawn() 而不是 spawnSync()。虽然这意味着请求不再被阻止,但这意味着所有作业都同时执行。我研究了 Bull 的并发性,但是当 child_process 像 spawn() 或 exec() 一样异步时,一旦程序成功开始,作业就会被标记为完成 - 它不会等待 spawn() 完成。这意味着服务器认为该作业已完成并愉快地加载了另一个作业,并且我很快耗尽了内存并且系统崩溃了。我根本无法限制或控制内存使用量。如果我需要为每个进程提供更多内存,那么我一次只能运行 1 个
在 osmQueue.add() 之前简单调用 res.send()。这对行为没有任何改变。
在队列中使用限制器:{max, duration} 选项。如果我将限制持续时间设置为 5 小时,这会起作用,但这会大大减少我一次可以做的工作量到无法接受的低水平。
我一直在阅读并搜索了很长一段时间,但我找不到与我类似的问题。
问题:
- 为什么系统进程在执行 res.send() 之后会阻塞 node/express?
- 我应该使用另一个库吗?
- 非常感谢知情人士的任何见解。
让我知道是否还有其他可以添加的内容,我会尽快完成。
TL;博士要求:
作为作业的一部分按顺序执行系统进程,一个接一个地执行,而不会阻止服务器在现有作业运行时排队更多作业或响应请求。
node.js - 带有 Bull 的 NodeJS:无法运行作业/队列两次,得到:错误:无法定义相同的处理程序两次 __default__
我创建了一个工作,允许我创建一个包含动态内容的 pdf 文件。当我第一次发出帖子请求并开始工作时它可以工作,但第二次它失败并出现上述错误。
我在 invoiceWorker.ts 文件中的基本内容是:
启动进程函数添加了一个进程处理程序并运行生成的PDfInvoice 函数,该函数基本上创建一个pdf文件。
在另一个文件中,我得到:
它将作业添加到队列中。在我的控制器中,我有以下内容:`
angularjs - Angular Universal (SSR) 无法与 puppeteer、bulljs 等外部库集成
这只是为了描述问题和分享我的解决方案,我在上面卡了很多时间。
在我升级 Angular 10 -> 11 并将构建器从更改udk:udk-runner
为@angular-devkit
我面临的问题是当我将bundleDependencies
angular.json 中的字段设置为true
. Puppeteer 无法启动错误无法启动浏览器
然后我发现它也发生在我在服务器端使用的其他外部库上,如BullJS
Bull-Board
Puppeteer-Cluster
下面的错误
用于演示问题的 Github 源:https ://github.com/phattranky/angular-ssr-error-with-pupepteer
node.js - Cloud Run 上的 Nest.js 使用公牛运行计划作业会引发随机连接错误?
我正在尝试执行第 3 方 API 请求以获取大量分页数据(约 16k 个对象的数组,每个对象具有约 25 个键/值对),我认为我的速率受到限制,但请求在本地和在手动触发时也可以生产
但是当他们按计划运行时,我得到了这些随机连接错误
我在 Cloud Run 上运行 Nest.js 服务器
这是我的 Docker 配置
该实例有 4GiB 内存,2 个 CPU,请求超时设置为 2400 秒,每个容器的最大请求数为 80,最小和最大实例数分别设置为 1 和 25。
所有流量都通过 VPC 连接器路由,它是一个f1-micro
实例,最小实例设置为 2,最大实例设置为 10。
对于公牛,有 5 个不同的工人设置,它们被随机分配到工作中
我在之前部署到的 App Engine 上没有收到这些错误
有谁知道这是什么原因造成的?
node.js - 在快速服务器中运行时如何优雅地关闭bulmq?
- 我有一个使用 Bullmq 队列、调度程序和工作程序的快速应用程序。即使按下 Ctrl + CI 后,仍然可以看到节点进程在我的活动管理器中运行,但终端上的服务器关闭。我知道这一点,因为即使在服务器关闭到终端之后,bulmq 任务也开始输出 console.log 语句。
这就是我的 server.js 文件的样子
请注意,我在上面定义了一个 SIGINT 处理程序。这是我的工作没有退出的原因吗?我是否必须手动关闭 SIGINT 中的每个队列、工作程序和调度程序?我的 jobs/repeatable.js 文件如下所示
这是我的jobs.js 文件
这是我的 delete-expired-tokens.js 文件,另一个非常相似
如何优雅地关闭 Bullmq 任务队列?
node.js - 我想在 io.on("connection") 之外使用 socket.emit(),这种方法正确吗?
我正在制作推文删除器,我想向用户更新进度。我是 socket.io 的新手,我设法将反应前端连接到 nodejs/express 后端。
当用户单击删除按钮时,删除请求会发送到后端,然后处理包含推文的文件,感谢 Bull,每条推文都作为一个作业排队。
因为我添加ìo
到我的路由中,我可以在它们内部使用它,但io.emit()
会发送到连接的客户端,我只想通过socket.emit()
在我的路由内部以及队列中的作业内部使用来发送给发送者。
我尝试的方法是在内部编写一个io.on("connection")
这样的函数并使其成为全局函数:
这使我可以在队列处理功能中使用:
有一个更好的方法吗?我的方法是错误的还是存在任何缺陷?它在我做的几个测试中起作用。
node.js - 如何使用重试策略处理延迟的复杂任务
我有一个在 AWS Elastic Beanstalk 上运行的 Express + MongoDB 应用程序。
有时,来自客户端的请求需要服务器发出第三方 API 请求。对于来自客户端的每个这样的请求,我们可能需要执行多达 500 个任务。每个任务都包含对第三方 API 的两个链式请求。如果链中的任何请求失败,我们希望在 5 分钟内重试(但我们不想用两个请求重试整个链,如果链中的第一个请求成功,我们希望继续执行链中的第二个请求,链中的第二个请求取决于第一个请求的响应)。
我可以使用什么样的技术来建立这个逻辑?
现在我正在考虑使用与 Redis 一起使用并允许设置延迟作业的 Bull npm 包。为了在 AWS Elastic Beanstalk 上使用 Redis,我计划设置 Elastic Cache,这可能是一项在 AWS 上运行 Redis 的服务,并允许我们从 Elastic Beanstalk 内部运行的应用程序中使用它。这有什么意义吗?