问题标签 [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 - Nestjs调度一个接一个地执行队列
我有两种从 json/csv 导入产品和库存的方法。我已经实现了 NestJS Bull 模块来排队作业。两个导入过程都在异步运行并且工作正常。但是现在我想先完全处理产品导入队列,然后只处理库存导入队列。
工作模块.ts
工作服务.ts
作业处理器.ts
我们如何才能queueProductUpdateJob
先完全处理作业,然后再处理queueInventoryUpdateJob
?
redis - 如何配置 Bulljs 以连接集群的 Elasticcache redis?
const instantShiftQueue = new Queue('自动选择', process.env[process.env.REDIS_URL_ENV_NAME]);
如何连接上述 Bull.js 队列实例以使其与 AWS ElasticCache redis 一起使用?
node.js - NodeJS Bull queue.add 字符串化数据导致错误
我正在尝试类似的东西:
我得到错误:
我相信来自 https://github.com/OptimalBits/bull/blob/develop/lib/job.js#L190-L200。
似乎默认是尝试对整个作业对象进行字符串化,包括数据字段。因此,它抱怨提供的数据字段无法完全字符串化。有没有办法解决这个问题?是否无法将作业添加到具有不可字符串化的自定义数据字段的队列中?
我将service
对象实例注入作业的原因是因为我在nestjs中使用了一个单独的进程并且没有可用的依赖注入。我需要访问该服务才能从进程中执行某些数据库操作。我不想在每次进程运行时都创建单独的数据库连接。
任何帮助将不胜感激,谢谢。
编辑:我认为我的假设是不正确的。Redis 本身不能存储非字符串化的值。
node.js - 分叉进程中的Typeorm getconnection
我有以下用例:
- 一个使用 MongoDB 的 typeorm 的 NodeJS (nest) 应用程序
- 一个使用nestjs/bull的单独(分叉)进程,它是基于执行某些处理的某个事件创建的。
在单独的过程中,我需要执行一些任务,然后通过 Typeorm 连接到 Mongodb 以根据这些任务更新状态。但是,由于它是一个单独的进程,因此getConnection
使用 TypeORM 不起作用 - 从某种意义上说,如果我在父进程中创建了任何连接,我将无法在这个单独的进程中访问它们。我假设是因为,因为它是一个单独的进程,它不共享来自父进程的任何内存(除非显式复制连接之类的东西?不确定)。
我想知道是否有办法解决这个问题?还是我只需要在这个单独的进程中管理连接?关于如何在不只创建一堆独立连接而使数据库超载的情况下如何做到这一点的任何建议?
谢谢你。
sockets - Nodejs socket.io 在多个文件中发出数据
我的应用程序中有 socketClass.js 文件。此类处理创建服务器和 socket.io 模块调用。在我的 app.js 文件中,我调用 socketClass 并初始化类。然后,我根据数据在这个文件中调度队列事件。我确实使用“公牛队列包”。
这是我想要做的,我在worker.js中处理队列,所以当队列完成时,我想通知套接字。但是我如何在另一个 js 文件中将 daha 发送到套接字?
在 app.js 中初始化 socketClass 时,有没有办法在多个文件中发出 daha?
提前致谢。
node.js - 在集群中运行服务时重复的队列作业
我是使用分布式队列系统的新手,所以我想我的问题可能很奇怪。但真的希望能找到解决办法。
我有一个使用Bull Queue的 Node.js 微服务。该服务与 2 个队列一起工作:它订阅并在获取消息时firstQueue
为 生成作业。secondQueue
的返回值firstQueue
包含 的多个作业的数据secondQueue
。所以我制作这样的工作:
我secondQueue
在同一服务中有流程工作者:
它运作良好,但我想secondQueue
并行处理这些任务。微服务在 Docker Swarm 模式下作为 Docker 服务运行。所以我做出的第一个决定是使用replicas: N
Docker 服务选项。但这里有一个问题:我想要复制进程工作者secondQueue
,但我也得到复制的侦听器,因此我从N 次中firstQueue
读取了相同的消息。firstQueue
实际上,我只想接收一次消息并并行化作业流程。
我认为,使用replicas
Docker 服务选项对我没有帮助。而且我不知道如何实现我想要的。有一些方法/模式可以做到这一点吗?或者我为我的微服务选择了错误的架构?
node.js - 公牛队列阻止工作,同时获得不同功能的工作
当我在不同的函数上调用 getJob 时,我需要一种方法来阻止工作人员处理工作。我环顾四周,但找不到解决方案。
我有以下设置。在带有 express 的 nodeJS 中,我有工作节点。
- 以延迟状态创建的作业。
- 正在以不同的功能访问作业
- 独立处理作业的工作节点。只有在延迟时间结束时才会处理作业。
queue.getJob(id)
不会阻止工人处理工作。因此,处理工作的工人和处理工作的 jobReader 之间存在竞争。我正在根据工作状态将一些结果写入数据库。所以比赛条件是不可接受的。
显然, getJob 并没有阻止工作人员处理工作。如果作业是由具有 getJob 函数的其他函数读取的,是否有任何方法可以锁定或阻止工作人员的工作。
任何帮助或文档将不胜感激。
谢谢
adonis.js - 有没有办法删除 Rocketseat adonis Bull 中的预定工作?
我正在使用 Bull 提供程序来安排 adonisjs 项目中的作业。我需要能够删除重复性工作,但我找不到解决方法。例如,用户安排了每天运行的报告作业,但随后决定停用它。我该怎么做呢?
redis - 如何在 Nestjs 公牛中一次执行预定义数量的作业
我有 65 个同名作业要在一个队列中执行,其中包含 3 个消费者实例(A、B、C)。我想一次让每个消费者执行 10 个工作。10 次执行完成后,如果队列中有大于 10 的可用作业,则消费者再次执行 10 次作业。如果不执行可用作业。
工作 1 至 65
消费者 A 执行 1 到 10 消费者 B 执行 11 到 20 消费者 C 执行 21 到 30
让B,A,C按顺序完成执行。然后
B - 31,32,33,.40 A - 41,42,43,.50 C - 51,52,53,.60
如果 C 先完成执行,则 C 执行剩余的 5 个作业。请我知道有什么方法可以做到这一点。
制片人
消费者
所有 3 个消费者都与上述相同。
javascript - Bull 不会在没有 redis 的情况下在 localhost:6379 上运行,即使我在不同的端口上运行 redis
当 hasura 看到表上的更新并触发有效负载到电子邮件微服务时,我正在使用 Bull 处理发送邮件。
问题是,尽管 hasura 成功发送了有效负载,但如果 redis 没有在 localhost:6379 上运行,即使我在 6380 上运行 redis 并在
BullModule.registerQueue({ name: MAIL_QUEUE, redis: {host: 'localhost', port: 6380 })
最重要的是,如果有一个 redis 实例在 6379 上运行,那么 Bull 将完全忽略我在 registerQueue 中使用的参数,并以某种方式使用 redis 0n 6379 顺利工作。
用于繁殖:
邮件模块.ts
邮件处理器.ts
用户服务.ts
因此,来自 hasura 的触发器到达user.service.ts但永远不会被添加到队列中,除非有一个 redis 实例在 6379 上运行。
顺便说一句,这是错误:
帮助!!